数値演算をより忠実にした
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user