首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gcc 4.6.0在x86和x86_64上的应用

Gcc 4.6.0在x86和x86_64上的应用
EN

Stack Overflow用户
提问于 2011-06-23 16:22:28
回答 1查看 15.5K关注 0票数 17

我有中型C99程序,它使用long double类型(80位)进行浮点计算.我想提高精度与新GCC 4.6扩展__float128。据我所知,这是一个软件模拟128位精度的数学.

我应该如何转换我的程序从经典的长双80位到四浮动128位与软件仿真的全精度?我需要换什么?编译器标志,源?

我的程序使用strtod读取完整的精度值,对它们执行许多不同的操作(比如+-*/ sin、cos、exp和其他来自<math.h>的操作)和printf-ing。

PS:尽管float128只为Fortran声明(REAL*16),但它用C编写,并使用float128。我不确定GCC是否会将float128上的操作转换为运行时库,我也不知道如何在我的源代码中从long double迁移到__float128。

PPS:有一个关于"C“语言gcc模式的文档:http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html

"GNU编译器支持. 128位(TFmode)浮动类型。对其他类型的支持包括算术运算符:加、减、乘、除;一元算术运算符;关系运算符;相等运算符. __float128类型在i386,x86_64"

中得到支持

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-04 18:44:02

如何将我的程序从经典的长双80位转换成128位的四位浮标,并进行完全精度的软件仿真?我需要换什么?编译器标志,源?

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

definitions.

  • You应将
  • 添加#include <quadmath.h>标头以具有宏和函数,将所有long double变量定义修改为__float128。使用typedef _Complex float __attribute__((mode(TC))) _Complex128;
  • All,
  • 复杂变量可以更改为__complex128类型(quadmath.h)或直接由GCC (转换为__*tf3()等辅助函数调用)自动处理简单的算术操作。如果使用任何宏(如http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)
  • If ),则将其替换为FLT128_* (完整列表

)--您需要使用四重精度的特定常量,如pi (M_PI)或e (M_E);使用带有q后缀(M_*q)的预定义常量,如M_PIqM_Eq (可以用Q后缀编写完整的列表常量,如1.3000011111111Q

  • All函数调用应替换为*q版本,如sqrtq()http://gcc.gnu.org/onlinedocs/libquadmath/Math-Library-Routines.html#Math-Library-Routines)
  • Reading (完整列表)四字串浮点应该用__float128 strtoflt128 (const char *s, char **sp) - http://gcc.gnu.org/onlinedocs/libquadmath/strtoflt128.html#strtoflt128来完成(警告,在较旧的lib摄制中,strtoflt128中可能有一些bug,做双check)
  • Printing __float128是借助quadmath_snprintf函数完成的。在最近使用glibc的linux发行版上,该函数将由lib44自动注册,以处理Q (也可能是q)所有printfs/sprintf中的a, A, e, E, f, F, g, G转换说明符的长度修饰符,就像它对长双的L所做的那样。示例:http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf

printf ("%Qe", 1.2Q)

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

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6457385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档