数値演算をより忠実にした
This commit is contained in:
@@ -8,6 +8,10 @@ DEF MAXMINTEST
|
|||||||
NEXT
|
NEXT
|
||||||
ASSERT__ MAX(A)==5,"MAX"
|
ASSERT__ MAX(A)==5,"MAX"
|
||||||
ASSERT__ MIN(A)==1,"MIN"
|
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
|
END
|
||||||
MAXMINTEST
|
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)
|
if (!l.isNumber || !r.isNumber)
|
||||||
throw new TypeMismatch();
|
throw new TypeMismatch();
|
||||||
|
double ld;
|
||||||
int li = l.integerValue;
|
|
||||||
double ld = l.integerValue;
|
|
||||||
if(l.type == ValueType.Double)
|
if(l.type == ValueType.Double)
|
||||||
{
|
{
|
||||||
li = cast(int)l.doubleValue;
|
li = cast(int)l.doubleValue;
|
||||||
ld = l.doubleValue;
|
ld = l.doubleValue;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ld = l.integerValue;
|
||||||
|
}
|
||||||
//とりあえずInteger
|
//とりあえずInteger
|
||||||
switch(operator)
|
switch(operator)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1875,6 +1875,23 @@ class BuiltinFunction
|
|||||||
}
|
}
|
||||||
return minPos!"a.castDouble < b.castDouble"(args)[0].castDouble;
|
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;
|
//alias void function(PetitComputer, Value[], Value[]) BuiltinFunc;
|
||||||
static BuiltinFunctions[wstring] builtinFunctions;
|
static BuiltinFunctions[wstring] builtinFunctions;
|
||||||
static wstring getBasicName(BFD)(const wstring def)
|
static wstring getBasicName(BFD)(const wstring def)
|
||||||
|
|||||||
Reference in New Issue
Block a user