- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有使用 long double
的中等大小的 C99 程序用于浮点计算的类型(80 位)。我想通过新的 GCC 4.6 扩展提高精度 __float128
.据我所知,它是一个软件模拟的 128 位精度数学。
我应该如何使用全精度的软件仿真将我的程序从 80 位的经典 long double 转换为 128 位的四浮点数?
我需要改变什么?编译器标志,来源?
我的程序使用 strtod
读取全精度值,对它们做很多不同的操作(比如 +-*/sin, cos, exp 和其他来自 <math.h>
)和 printf
-ing 他们。
PS:尽管 float128 仅针对 Fortran (REAL*16) 声明,但 libquadmath 是用 C 编写的,它使用 float128。我不确定 GCC 是否会将 float128 上的操作转换为运行时库,我不确定如何在我的源代码中从 long double 迁移到 __float128。
PPS:有关于“C”语言 gcc 模式的文档:http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
"GNU C compiler supports ... 128 bit (TFmode) floating types. Support for additional types includes the arithmetic operators: add, subtract, multiply, divide; unary arithmetic operators; relational operators; equality operators ... __float128 types are supported on i386, x86_64"
最佳答案
How should I convert my program from classic long double of 80-bit to quad floats of 128 bit with software emulation of full precision? What need I change? Compiler flags, sources?
__float128
的 GCC 版本type(4.6 和更新版本)和 libquadmath(仅支持
x86 and x86_64 targets ;在 IA64 和 HPPA 中使用更新的 GCC)。您应该添加链接器标志
-lquadmath
(
cannot find -lquadmath'
将显示您没有安装 libquadmath)
#include <quadmath.h>
header 具有宏和函数定义。 long double
变量定义到 __float128
. __complex128
输入 ( quadmath.h
) 或直接输入 typedef _Complex float __attribute__((mode(TC))) _Complex128;
__*tf3()
)。 LDBL_*
,将它们替换为 FLT128_*
(完整列表 http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)M_PI
) 或 e ( M_E
),请使用预定义的常量 q
后缀( M_*q
),如 M_PIq
和 M_Eq
(完整列表 http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)Q
后缀,如 1.3000011111111Q
*q
版本,如 sqrtq()
, sinq()
(完整列表 http://gcc.gnu.org/onlinedocs/libquadmath/Math-Library-Routines.html#Math-Library-Routines)__float128 strtoflt128 (const char *s, char **sp)
完成- http://gcc.gnu.org/onlinedocs/libquadmath/strtoflt128.html#strtoflt128 (警告,在较旧的 libquadmaths 中,strtoflt128 中可能存在一些错误,请仔细检查)__float128
是在 quadmath_snprintf
的帮助下完成的功能。在具有最新 glibc 的 linux 发行版上,libquadmath 将自动注册该函数以处理 Q
(也可能是 q
) a, A, e, E, f, F, g, G
的长度修饰符全部转换说明符 printf
s/sprintf
s,就像以前一样L
长 double 。示例:printf ("%Qe", 1.2Q)
, http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf __float128
如果选项
-fdefault-real-8
,则输入 DOUBLE PRECISION给出并且没有选项
-fdefault-double-8
.这可能是个问题,因为由于软件计算,128 long double 在许多平台上比标准 long double 慢得多。 (感谢 glennglockwood
http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html 的帖子)
关于gcc - 如何在 x86 和 x86_64 上使用 Gcc 4.6.0 libquadmath 和 __float128,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457385/
我是一名优秀的程序员,十分优秀!