将 haxe.Int64 转换为 Float?
Convert a haxe.Int64 to a Float?
如何将 haxe.Int64 转换为 Float?
我有类似的东西
var x = haxe.Int64.parseString("1000000000000");
我想将其转换为浮点数。我查看了 the Int64 api docs,找到了 fromFloat
、ofInt
和 toInt
,但是那里没有 toFloat
方法。
我在 Haxe 标准库中也看不到该功能,我检查了 Int64
和 Int64Helper
。
然而 MIT-licensed thx.core library does include an implementation, see below: https://github.com/fponticelli/thx.core/blob/master/src/thx/Int64s.hx#L137
using haxe.Int64;
class Int64s {
static var zero = Int64.make(0, 0);
static var one = Int64.make(0, 1);
static var min = Int64.make(0x80000000, 0);
/**
Converts an `Int64` to `Float`;
Implementation by Elliott Stoneham.
*/
public static function toFloat(i : Int64) : Float {
var isNegative = false;
if(i < 0) {
if(i < min)
return -9223372036854775808.0; // most -ve value can't be made +ve
isNegative = true;
i = -i;
}
var multiplier = 1.0,
ret = 0.0;
for(_ in 0...64) {
if(i.and(one) != zero)
ret += multiplier;
multiplier *= 2.0;
i = i.shr(1);
}
return (isNegative ? -1 : 1) * ret;
}
}
使用库方法对我有用,在 JavaScript 目标上测试如下:
import haxe.Int64;
import thx.Int64s;
class Main {
public static function main():Void {
var x:Int64 = haxe.Int64.parseString("1000000000000");
var f:Float = thx.Int64s.toFloat(x);
trace(f); // Prints 1000000000000 to console (on js target)
}
}
或者,您可以通过组合 high/low 两半来自己将 Int64 转换为 Float:
class Test {
static function main() {
var x = haxe.Int64.parseString("1000000000000");
var f = x.high * 4294967296. + (x.low >>> 0);
trace("" + x);
trace(f);
}
}
在这里,
4294967296.
是无符号 2^32 的浮点数;
>>> 0
是必需的,因为下半部分可以签名。
或者,对于简单的转换方法,您可以使用:
var f = Std.parseFloat(haxe.Int64.toStr(x));
您可能想尝试使用 FPHelper
class。它包含一组将 Int 类型转换为 Float / Double 的方法。
import haxe.io.FPHelper;
class Test {
static function main() {
var x = haxe.Int64.parseString("1000000000000");
var f = FPHelper.i64ToDouble(x.low, x.high);
trace(f);
}
}
如何将 haxe.Int64 转换为 Float?
我有类似的东西
var x = haxe.Int64.parseString("1000000000000");
我想将其转换为浮点数。我查看了 the Int64 api docs,找到了 fromFloat
、ofInt
和 toInt
,但是那里没有 toFloat
方法。
我在 Haxe 标准库中也看不到该功能,我检查了 Int64
和 Int64Helper
。
然而 MIT-licensed thx.core library does include an implementation, see below: https://github.com/fponticelli/thx.core/blob/master/src/thx/Int64s.hx#L137
using haxe.Int64;
class Int64s {
static var zero = Int64.make(0, 0);
static var one = Int64.make(0, 1);
static var min = Int64.make(0x80000000, 0);
/**
Converts an `Int64` to `Float`;
Implementation by Elliott Stoneham.
*/
public static function toFloat(i : Int64) : Float {
var isNegative = false;
if(i < 0) {
if(i < min)
return -9223372036854775808.0; // most -ve value can't be made +ve
isNegative = true;
i = -i;
}
var multiplier = 1.0,
ret = 0.0;
for(_ in 0...64) {
if(i.and(one) != zero)
ret += multiplier;
multiplier *= 2.0;
i = i.shr(1);
}
return (isNegative ? -1 : 1) * ret;
}
}
使用库方法对我有用,在 JavaScript 目标上测试如下:
import haxe.Int64;
import thx.Int64s;
class Main {
public static function main():Void {
var x:Int64 = haxe.Int64.parseString("1000000000000");
var f:Float = thx.Int64s.toFloat(x);
trace(f); // Prints 1000000000000 to console (on js target)
}
}
或者,您可以通过组合 high/low 两半来自己将 Int64 转换为 Float:
class Test {
static function main() {
var x = haxe.Int64.parseString("1000000000000");
var f = x.high * 4294967296. + (x.low >>> 0);
trace("" + x);
trace(f);
}
}
在这里,
4294967296.
是无符号 2^32 的浮点数;
>>> 0
是必需的,因为下半部分可以签名。
或者,对于简单的转换方法,您可以使用:
var f = Std.parseFloat(haxe.Int64.toStr(x));
您可能想尝试使用 FPHelper
class。它包含一组将 Int 类型转换为 Float / Double 的方法。
import haxe.io.FPHelper;
class Test {
static function main() {
var x = haxe.Int64.parseString("1000000000000");
var f = FPHelper.i64ToDouble(x.low, x.high);
trace(f);
}
}