基本的に、私は次のインターフェイスの機能を探しています:それのための文字列表現に二重に変換浮動小数点数をATSの文字列に変換する方法は?
fun double2string(x: double): string
を。例えば、double2string(3.14)は "3.14"を返します。
基本的に、私は次のインターフェイスの機能を探しています:それのための文字列表現に二重に変換浮動小数点数をATSの文字列に変換する方法は?
fun double2string(x: double): string
を。例えば、double2string(3.14)は "3.14"を返します。
時々私は、次のチートを選択します。
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
%{^
#include <assert.h>
char *double2string(double x) {
#define DECIMAL 8
#define DECIMAL_FORMAT "%.8e"
#define DECIMAL_LEN DECIMAL+2+5
char *s = malloc(DECIMAL_LEN+1);
assert(NULL != s);
memset(s, 0, DECIMAL_LEN+1);
snprintf(s, DECIMAL_LEN, DECIMAL_FORMAT, x);
return s;
}
%}
extern fun double2string (x: double): strptr = "mac#"
implement main0() = {
val s = double2string 1234567890.1234567890
val() = println! s
val() = free s
}
文字列を構築するためのATSLIBで名前atspre_string_make_snprintf
の機能があります。たとえば、1は行うことができますどのようなatspre_string_make_snprintfによって返されることは解放することができ、線形文字列(StrPtrを)、である
#include
"share/atspre_staload.hats"
fun
double2string(x: double): string =
$extfcall
(
string, "atspre_string_make_snprintf", "%.8e", x
) (* double2string *)
implement
main0() =
println! ("Pi = ", double2string(3.1415926535))
を:
fun double2strptr(x: double): Strptr1 = $extfcall(...)
コンパイルするときに、フラグを渡すことを忘れないでください-latslib 。あなたがオンラインでこの例を試すことができます。
JavaScriptにコンパイルするため、「string」は、これを行うために呼び出すことができます。実際、 'String'は任意のオブジェクトを何らかの形式の文字列表現に変換します。ここで
はそれを行うための簡単な方法です:
fun
double2string
(
x0: double
) : string = let
val i0 = g0float2int_double_int(x0)
val d0 = g0float2int_double_int(100000000 * (x0 - i0))
val i0_rep = g0int2string(i0)
val d0_rep = g0int2string(d0)
val x0_rep =
string0_append3
($UNSAFE.strptr2string(i0_rep), ".", $UNSAFE.strptr2string(d0_rep))
// end of [val]
val ((*freed*)) = strptr_free(i0_rep)
val ((*freed*)) = strptr_free(d0_rep)
in
strptr2string(x0_rep)
end // end of [double2string]
多分これが検索に関連している:https://github.com/githwxi/ATS-Postiats/blob/master/prelude/DATS/CODEGEN /tostring.atxtとhttps://github.com/githwxi/ATS-Postiats/commit/28b20bc1ec78e3cf70bd2ac7ca676867a75b8c32 – Hackerman
tostring_double(または線形バージョンの場合はtostrptr_double)を試してください。 –