1
0

数値演算をより忠実にした

This commit is contained in:
otya128
2016-09-03 16:24:59 +09:00
parent 361a8e04c1
commit 1bbcc3d50c
3 changed files with 93 additions and 3 deletions

View File

@@ -8,6 +8,10 @@ DEF MAXMINTEST
NEXT
ASSERT__ MAX(A)==5,"MAX"
ASSERT__ MIN(A)==1,"MIN"
ASSERT__ MAX(2,0)*&H7FFFFFFF==-2,"MAX"
ASSERT__ MAX(2,0,0)*&H7FFFFFFF==4294967294,"MAX"
ASSERT__ MIN(2,4)*&H7FFFFFFF==-2,"MIN"
ASSERT__ MAX(2,4,4)*&H7FFFFFFF==4294967294,"MIN"
END
MAXMINTEST

View File

@@ -601,16 +601,85 @@ class Operate : Code
}
}
}
int li = l.integerValue;
if (l.isInteger && r.isInteger)
{
switch(operator)
{
case TokenType.Plus:
vm.push(Value(li + ri));
return;
case TokenType.Minus:
vm.push(Value(li - ri));
return;
case TokenType.Mul:
vm.push(Value(li * ri));
return;
case TokenType.Div:
vm.push(Value(li / ri));
return;
case TokenType.IntDiv:
//TODO:範囲外だとOverflow
vm.push(Value(cast(int)(li / ri)));
return;
case TokenType.Mod:
vm.push(Value(li % ri));
return;
case TokenType.And:
vm.push(Value(li & ri));
return;
case TokenType.Or:
vm.push(Value(li | ri));
return;
case TokenType.LogicalAnd:
vm.push(Value(li && ri));
return;
case TokenType.LogicalOr:
vm.push(Value(li || ri));
return;
case TokenType.Xor:
vm.push(Value(li ^ ri));
return;
case TokenType.Equal:
vm.push(Value(li == ri));
return;
case TokenType.NotEqual:
vm.push(Value(li != ri));
return;
case TokenType.Less:
vm.push(Value(li < ri));
return;
case TokenType.LessEqual:
vm.push(Value(li <= ri));
return;
case TokenType.Greater:
vm.push(Value(li > ri));
return;
case TokenType.GreaterEqual:
vm.push(Value(li >= ri));
return;
case TokenType.LeftShift:
vm.push(Value(li << ri));
return;
case TokenType.RightShift:
vm.push(Value(li >> ri));
return;
default:
}
}
if (!l.isNumber || !r.isNumber)
throw new TypeMismatch();
int li = l.integerValue;
double ld = l.integerValue;
double ld;
if(l.type == ValueType.Double)
{
li = cast(int)l.doubleValue;
ld = l.doubleValue;
}
else
{
ld = l.integerValue;
}
//とりあえずInteger
switch(operator)
{

View File

@@ -1875,6 +1875,23 @@ class BuiltinFunction
}
return minPos!"a.castDouble < b.castDouble"(args)[0].castDouble;
}
//MAX(2,0)*&H7FFFFFFFF!=MAX(2,0,0)*&H7FFFFFFFF
static Value MAX(Value a1, Value a2)
{
if (a1.type == ValueType.Integer && a2.type == ValueType.Integer)
{
return Value(a1.integerValue > a2.integerValue ? a1.integerValue : a2.integerValue);
}
return Value(a1.castDouble > a2.castDouble ? a1.castDouble : a2.castDouble);
}
static Value MIN(Value a1, Value a2)
{
if (a1.type == ValueType.Integer && a2.type == ValueType.Integer)
{
return Value(a1.integerValue < a2.integerValue ? a1.integerValue : a2.integerValue);
}
return Value(a1.castDouble < a2.castDouble ? a1.castDouble : a2.castDouble);
}
//alias void function(PetitComputer, Value[], Value[]) BuiltinFunc;
static BuiltinFunctions[wstring] builtinFunctions;
static wstring getBasicName(BFD)(const wstring def)