l*********i 发帖数: 483 | 1 偶有个做计算的c写的函数库,定义的时候所有的变量类型都是double,但是
因为计算精度的问题,现在想把所有的变量都变成long double,除了挨个改源文件
之外,有没有什么简单点的方法呢(比如compile的时候有没有什么特殊的flags
之类能干这个的)?
系统是64位的linux, compiler有gcc 4.2和icc 10.1(不知道是什么,貌似
gcc比icc慢不少,所以最后可能会用icc) |
y*w 发帖数: 238 | 2 用MACRO就可以了
如果一次性的改,用sed也可以 |
t****t 发帖数: 6806 | 3 x86吗? 注意x86上, 计算一律是80位的, double和long double的区别应该就是变量保
留多少
【在 l*********i 的大作中提到】 : 偶有个做计算的c写的函数库,定义的时候所有的变量类型都是double,但是 : 因为计算精度的问题,现在想把所有的变量都变成long double,除了挨个改源文件 : 之外,有没有什么简单点的方法呢(比如compile的时候有没有什么特殊的flags : 之类能干这个的)? : 系统是64位的linux, compiler有gcc 4.2和icc 10.1(不知道是什么,貌似 : gcc比icc慢不少,所以最后可能会用icc)
|
l*********i 发帖数: 483 | 4 是x86_64,Intel Core 2 duo,计算一律是80位是啥意思啊,如果一个变
量i (double或者long double)经过很多步算术运算,是说仅仅是最后一步的
的数值的保留位数不同么?
【在 t****t 的大作中提到】 : x86吗? 注意x86上, 计算一律是80位的, double和long double的区别应该就是变量保 : 留多少
|
l*********i 发帖数: 483 | 5 啊,太感谢了,果然,用#define double long double好像就搞定了。
【在 y*w 的大作中提到】 : 用MACRO就可以了 : 如果一次性的改,用sed也可以
|
t****t 发帖数: 6806 | 6 就是说,x86/x86_64的CPU,浮点运算单元就是80位的
你变量可以是96位或者128位,但是后面的啥都没有
【在 l*********i 的大作中提到】 : 啊,太感谢了,果然,用#define double long double好像就搞定了。
|
c*****e 发帖数: 8 | 7 用了这个宏就不用修改函数了?比方说sqrt不用改成sqrtl?
long double sqrt(long double x); [C++ only]
long double sqrtl(long double x); [optional]
C++里面还是用sqrt,但是一般的C里面还要改吗?谢谢!
【在 l*********i 的大作中提到】 : 啊,太感谢了,果然,用#define double long double好像就搞定了。
|
l*********i 发帖数: 483 | 8 哦,原来是这样,长知识了,呵呵。
【在 t****t 的大作中提到】 : 就是说,x86/x86_64的CPU,浮点运算单元就是80位的 : 你变量可以是96位或者128位,但是后面的啥都没有
|
l*********i 发帖数: 483 | 9 不好意思,再请教一下,我看到gcc在x86_64下面缺省的-mfpmath的flag的设置
是sse,在网上google到这么一段:
"sse- take a benefit of SSE2 (SSE3) instruction set (Streaming SIMD
Extension, SIMD - Single Instruction Multiple Data), a default mode for x86-
64 processors, to use this option one should also enable SSE and SSE2 (SSE3)
instruction set to be used in machine code, the FP computations are done
simultaniously on a 16 new 128bit registers (xmm0-xmm15), each of xmm
register makes the same operation on 2 doubles (or 4 floats), the re
【在 t****t 的大作中提到】 : 就是说,x86/x86_64的CPU,浮点运算单元就是80位的 : 你变量可以是96位或者128位,但是后面的啥都没有
|
t****t 发帖数: 6806 | 10 你再仔细读一遍, 我觉得这个说得很清楚
SSEx做的是64b或32b的浮点运算,比x87的80位更少
所谓128位是说可以两个64b或者4个32b一起运算,当然会快一些。
x86-
SSE3)
is
【在 l*********i 的大作中提到】 : 不好意思,再请教一下,我看到gcc在x86_64下面缺省的-mfpmath的flag的设置 : 是sse,在网上google到这么一段: : "sse- take a benefit of SSE2 (SSE3) instruction set (Streaming SIMD : Extension, SIMD - Single Instruction Multiple Data), a default mode for x86- : 64 processors, to use this option one should also enable SSE and SSE2 (SSE3) : instruction set to be used in machine code, the FP computations are done : simultaniously on a 16 new 128bit registers (xmm0-xmm15), each of xmm : register makes the same operation on 2 doubles (or 4 floats), the re
|
l*********i 发帖数: 483 | 11 多谢多谢,也就是说如果我比较在意精度,又不想折腾去搞那个无限精度
库的话,最好的选择是用long double再选择x87的FPU?
【在 t****t 的大作中提到】 : 你再仔细读一遍, 我觉得这个说得很清楚 : SSEx做的是64b或32b的浮点运算,比x87的80位更少 : 所谓128位是说可以两个64b或者4个32b一起运算,当然会快一些。 : : x86- : SSE3) : is
|