2013-05-10 39 views
1

我想知道是否有一個建立的約定來指定十進制格式的定點二進制數(使用宏)。我不確定這是否可能在C/C++中,但也許這是用某種語言實現的,並且有像0x000000,1.2f,1.2d,1l等符號標準用宏指定數字定點二進制數的約定

以此示例爲例:

我使用例如Q15.16,但想在十進制格式指定號碼,也許是這樣的便利:

VAR NUM:=的Int32 1.2fp;

@:

據推測,關於HAXE宏最簡單的方法,數字可以用函數初始化宏 fp_from_float(1.2);

但是,如果有一個簡寫符號會很好。

回答

3

你見過Luca的固定點例子Haxe 3和摘要嗎? 它在這裏: 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元數據。有了這個代碼,你就已經可以宣告固定的類型是這樣的:在這裏

@: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()); 
    } 

再次,祕密:

var x:Fixed16 = 1.2; 

盧卡的已定義的一些運營商,使他們的工作更容易,像在@:op(A + B)元數據中,它將註釋在處理添加時可能會調用此函數。完整的GIST代碼可在https://gist.github.com/deltaluca/5413225獲得,您可以通過http://haxe.org/manual/abstracts

+0

瞭解更多關於摘要的信息!太美了! – MetaChrome 2013-05-11 12:26:40