1

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

以这个例子为例:

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

变量编号:Int32=1.2fp;

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

@:宏 fp_from_float(1.2);

但是最好有一个速记符号。

4

1 回答 1

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

于 2013-05-10T12:15:12.957 回答