使用宏指定数字定点二进制数的约定

时间:2013-05-10 09:08:21

标签: haxe fixed-point

我想知道是否存在以十进制格式指定定点二进制数的已建立约定(使用宏)。我不确定这是否可能在C / C ++中,但也许这是用某些语言实现的,并且有一个符号标准,如0x000000,1.2f,1.2d,1l等

举个例子:

我正在使用Q15.16,但希望能够方便地以十进制格式指定数字,可能是这样的:

var num:Int32 = 1.2fp;

据推测,关于Haxe宏的最简单方法,数字可以用函数初始化:

@:宏 fp_from_float(1.2);

但是有一个速记符号会很好。

1 个答案:

答案 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了解有关摘要的更多信息