我想知道是否有一个既定的约定以十进制格式指定定点二进制数(使用宏)。我不确定这在 C/C++ 中是否可行,但也许这是在某些语言中实现的,并且有一个符号标准,如 0x000000、1.2f、1.2d、1l 等
以这个例子为例:
例如,我正在使用 Q15.16,但希望能够方便地以十进制格式指定数字,可能是这样的:
变量编号:Int32=1.2fp;
据推测,关于 Haxe 宏的最简单方法,可以使用函数初始化数字:
@:宏 fp_from_float(1.2);
但是最好有一个速记符号。
我想知道是否有一个既定的约定以十进制格式指定定点二进制数(使用宏)。我不确定这在 C/C++ 中是否可行,但也许这是在某些语言中实现的,并且有一个符号标准,如 0x000000、1.2f、1.2d、1l 等
以这个例子为例:
例如,我正在使用 Q15.16,但希望能够方便地以十进制格式指定数字,可能是这样的:
变量编号:Int32=1.2fp;
据推测,关于 Haxe 宏的最简单方法,可以使用函数初始化数字:
@:宏 fp_from_float(1.2);
但是最好有一个速记符号。
你见过 Luca 的 Haxe 3 和 Abstracts 的定点示例吗?它在这里: https ://groups.google.com/forum/?fromgroups=#!topic/haxelang/JsiWvl-c0v4
总结一下,使用新的 Haxe 3 抽象类型,您可以定义一个将被编译为 Int 的类型:
abstract Fixed16(Int)
{
inline function new(x:Int) this = x;
}
您还可以定义“转换函数”,这将允许您自动将浮点数转换为 Fixed16:
@:from public static inline function fromf(x:Float) {
#if debug
if (x >= 32768.0 || x < -32768.0) throw "Conversion to Fixed16 will overflow";
#end
return new Fixed16(Std.int(x*65536.0));
}
这里的秘密是@:from
元数据。使用此代码,您已经能够像这样声明固定类型:
var x:Fixed16 = 1.2;
Luca 已经定义了一些操作符,以便更轻松地使用它们,例如:
@:op(A+B) public inline static function add(f:Fixed16, g:Fixed16) {
#if debug
var fr:Float = f.raw();
var gr:Float = g.raw();
if (fr+gr >= 2147483648.0 || fr+gr < -2147483648.0) throw "Addition of Fixed16 values will overflow";
#end
return new Fixed16(f.raw()+g.raw());
}
同样,这里的秘密在 @:op(A+B) 元数据中,它将注释这个函数在处理加法时可能会被调用。完整的 GIST 代码可在https://gist.github.com/deltaluca/5413225获得,您可以在http://haxe.org/manual/abstracts了解有关摘要的更多信息