为什么转换为 extFloat80_t 总是 return 0?
Why does conversion to extFloat80_t always return 0?
我已经构建了我认为是 SoftFloat 库 (http://www.jhauser.us/arithmetic/SoftFloat.html) 提供的 extFloat80_t 类型最简单的用法,但看不出我做错了什么 - - 我尝试过的 i32 的所有值都会导致输出“0”。
#include "softfloat.h"
#include "stdio.h"
int main( int argc, char** argv )
{
int32_t i32 = 1000;
extFloat80_t f80 = i32_to_extF80(i32);
int32_t i80 = extF80_to_i32_r_minMag( f80, false );
printf( "%d\n", i80 );
return 0;
}
构建于
gcc -I source/include/ test.c -DSOFTFLOAT_FAST_INT64 build/Linux-x86_64-GCC/softfloat.a -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 -DSOFTFLOAT_FAST_DIV64TO32
我已在 Ubuntu/x86_64(版本 16.04)上重现了您的结果。 (您尚未指定目标的确切细节。请在以后的问题中提供此类关键数据。)
我已经通过添加
修复了它
#define LITTLEENDIAN 1
到主程序定义。在此之后,所有值都被正确恢复。
我想这与 Linux 中使用的 x86_64 SysV ABI 有关 - 它允许将按值传递的结构拆分为几个寄存器(而不是按指针传递),并错误定义字节序导致不正确的拆分。如果没有所需的定义,extFloat80_t
中的 signExp
和 signif
的顺序会颠倒。
我已经构建了我认为是 SoftFloat 库 (http://www.jhauser.us/arithmetic/SoftFloat.html) 提供的 extFloat80_t 类型最简单的用法,但看不出我做错了什么 - - 我尝试过的 i32 的所有值都会导致输出“0”。
#include "softfloat.h"
#include "stdio.h"
int main( int argc, char** argv )
{
int32_t i32 = 1000;
extFloat80_t f80 = i32_to_extF80(i32);
int32_t i80 = extF80_to_i32_r_minMag( f80, false );
printf( "%d\n", i80 );
return 0;
}
构建于
gcc -I source/include/ test.c -DSOFTFLOAT_FAST_INT64 build/Linux-x86_64-GCC/softfloat.a -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 -DSOFTFLOAT_FAST_DIV64TO32
我已在 Ubuntu/x86_64(版本 16.04)上重现了您的结果。 (您尚未指定目标的确切细节。请在以后的问题中提供此类关键数据。)
我已经通过添加
修复了它#define LITTLEENDIAN 1
到主程序定义。在此之后,所有值都被正确恢复。
我想这与 Linux 中使用的 x86_64 SysV ABI 有关 - 它允许将按值传递的结构拆分为几个寄存器(而不是按指针传递),并错误定义字节序导致不正确的拆分。如果没有所需的定义,extFloat80_t
中的 signExp
和 signif
的顺序会颠倒。