@@ -431,8 +431,12 @@ do_loop_end : {
431431
432432do_round : {
433433 const Value *v = READ_REG (0 , 1 );
434- if (!v->isInfinity () && !v->isNegativeInfinity ())
435- REPLACE_RET_VALUE (static_cast <long >(std::round (v->toDouble ())), 1 );
434+ if (!v->isInfinity () && !v->isNegativeInfinity ()) {
435+ if (v->toDouble () < 0 ) {
436+ REPLACE_RET_VALUE (static_cast <long >(std::floor (v->toDouble () + 0.5 )), 1 );
437+ } else
438+ REPLACE_RET_VALUE (static_cast <long >(v->toDouble () + 0.5 ), 1 );
439+ }
436440 DISPATCH ();
437441}
438442
@@ -491,7 +495,11 @@ do_tan : {
491495 if (v->isInfinity () || v->isNegativeInfinity ())
492496 REPLACE_RET_VALUE (Value (Value::SpecialValue::NaN), 1 );
493497 else {
494- long mod = v->toLong () % 360 ;
498+ long mod;
499+ if (v->toLong () < 0 )
500+ mod = (v->toLong () + 360 ) % 360 ;
501+ else
502+ mod = v->toLong () % 360 ;
495503 if (mod == 90 )
496504 REPLACE_RET_VALUE (Value (Value::SpecialValue::Infinity), 1 );
497505 else if (mod == 270 )
@@ -522,8 +530,10 @@ do_acos : {
522530
523531do_atan : {
524532 const Value &v = *READ_REG (0 , 1 );
525- if (v < -1 || v > 1 )
526- REPLACE_RET_VALUE (Value (Value::SpecialValue::NaN), 1 );
533+ if (v.isInfinity ())
534+ REPLACE_RET_VALUE (90 , 1 );
535+ else if (v.isNegativeInfinity ())
536+ REPLACE_RET_VALUE (-90 , 1 );
527537 else
528538 REPLACE_RET_VALUE (std::atan (v.toDouble ()) * 180 / pi, 1 );
529539 DISPATCH ();
0 commit comments