我想知道是否存在以十进制格式指定定点二进制数的已建立约定(使用宏)。我不确定这是否可能在C / C ++中,但也许这是用某些语言实现的,并且有一个符号标准,如0x000000,1.2f,1.2d,1l等
举个例子:
我正在使用Q15.16,但希望能够方便地以十进制格式指定数字,可能是这样的:
var num:Int32 = 1.2fp;
据推测,关于Haxe宏的最简单方法,数字可以用函数初始化:
@:宏 fp_from_float(1.2);
但是有一个速记符号会很好。
答案 0 :(得分:3)
您是否看过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了解有关摘要的更多信息