2011-06-23 48 views
12

我有中等大小的C99程序,它使用long double类型(80位)进行浮点计算。我想通过新的GCC 4.6扩展__float128提高精度。就我所知,它是一个软件模拟的128位精度数学。如何在x86和x86_64上使用Gcc 4.6.0 libquadmath和__float128

我应该如何将我的程序从经典的80位双精度长度转换为128位四精度浮点运算以及全精度软件仿真? 我需要改变什么?编译器标志,来源?

我的计划有充分的精度值读数与strtod,他们做了很多不同的操作(如+ - * /正弦,余弦,从<math.h> EXP等)和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编译器支持... 128位(TFmode)浮点类型对其他类型的支持包括算术运算符: 加,减,乘,除;一元算术运算符,关系运算符;平等服务商... __float128类型都支持在i386,x86_64" 的

+0

libquadmath在这里http://gcc.gnu.org/onlinedocs/libquadmath/index.html#toc_Top这里是关于这个http://gcc.gnu.org/gcc的消息-4.6/changes.html“GCC现在附带LGPL许可的libquadmath库,该库为__float128数据类型的目标提供四精度数学函数__float128可用于32位x86,x86-64和Itanium体系结构上的目标。 “ – osgx

+0

转而基本操作由'glibc/soft-fp'完成,例如'__subtf3()'http://koala.cs.pub.ro/lxr/#glibc+2.9/soft-fp/subtf3.c# L35 http://gcc.gnu.org/wiki/Software_floating_point – osgx

+1

使用libquadmath,您可以使用[strtoflt128](http://webcache.googleusercontent.com/search?q=cache:P0PwG_dRv4EJ:gcc.gnu.org/onlinedocs /libquadmath.ps.gz+&cd=1&hl=zh-CN&ct=clnk&client=ubuntu)作为'strtod'替换ENT。 –

回答

21

我应该如何转换我的程序从CLASSI双倍的80位到四位浮点数128位软件模拟全精度?我需要改变什么?编译器标志,来源?

你需要最新版本的软件,GCC版本支持__float128型(4.6及更高版本)和libquadmath的(仅支持x86 and x86_64 targets;在IA64和HPPA与新GCC)。您应该添加链接器标志-lquadmath(该cannot find -lquadmath'将显示已安装没有libquadmath)

你也应该知道,自从4.6 Gfortran将使用__float128型双精度如果选项-fdefault-real-8给出并且没有选项-fdefault-double-8。这可能是个问题,因为由于软件计算的原因,128个double double比许多平台上的标准long double慢得多。 (感谢由glennglockwood http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html发布)

相关问题