ソースを参照

Fix FPHelper.i32ToFloat for some specific values (#5435)

Pascal Peridont 9 年 前
コミット
3a74d3c3d7
2 ファイル変更16 行追加1 行削除
  1. 5 1
      std/haxe/io/FPHelper.hx
  2. 11 0
      tests/unit/src/unitstd/haxe/io/FPHelper.unit.hx

+ 5 - 1
std/haxe/io/FPHelper.hx

@@ -140,7 +140,11 @@ class FPHelper {
 			var af = f < 0 ? -f : f;
 			var exp = Math.floor(Math.log(af) / LN2);
 			if( exp < -127 ) exp = -127 else if( exp > 128 ) exp = 128;
-			var sig = Math.round((af / Math.pow(2, exp) - 1) * 0x800000) & 0x7FFFFF;
+			var sig = Math.round((af / Math.pow(2, exp) - 1) * 0x800000);
+			if( sig == 0x800000 && exp < 128 ){
+				sig = 0;
+				exp++;
+			}
 			return (f < 0 ? 0x80000000 : 0) | ((exp + 127) << 23) | sig;
 		#end
 	}

+ 11 - 0
tests/unit/src/unitstd/haxe/io/FPHelper.unit.hx

@@ -0,0 +1,11 @@
+function fp32( f : Float ) : Float {
+	return haxe.io.FPHelper.i32ToFloat(haxe.io.FPHelper.floatToI32(f));
+}
+
+fp32( -1.3 ) == -1.2999999523162842;
+fp32( 15.999999 ) == 15.999999046325684;
+fp32( 15.999999999 ) == 16;
+fp32( 16 ) == 16;
+fp32( 16.000000001 ) == 16;
+fp32( 16.000001 ) == 16.000001907348633;
+