Redian新闻
>
问个double和long double的问题
avatar
问个double和long double的问题# Programming - 葵花宝典
l*i
1
偶有个做计算的c写的函数库,定义的时候所有的变量类型都是double,但是
因为计算精度的问题,现在想把所有的变量都变成long double,除了挨个改源文件
之外,有没有什么简单点的方法呢(比如compile的时候有没有什么特殊的flags
之类能干这个的)?
系统是64位的linux, compiler有gcc 4.2和icc 10.1(不知道是什么,貌似
gcc比icc慢不少,所以最后可能会用icc)
avatar
y*w
2
用MACRO就可以了
如果一次性的改,用sed也可以
avatar
t*t
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)

avatar
l*i
4
是x86_64,Intel Core 2 duo,计算一律是80位是啥意思啊,如果一个变
量i (double或者long double)经过很多步算术运算,是说仅仅是最后一步的
的数值的保留位数不同么?

【在 t****t 的大作中提到】
: x86吗? 注意x86上, 计算一律是80位的, double和long double的区别应该就是变量保
: 留多少

avatar
l*i
5
啊,太感谢了,果然,用#define double long double好像就搞定了。

【在 y*w 的大作中提到】
: 用MACRO就可以了
: 如果一次性的改,用sed也可以

avatar
t*t
6
就是说,x86/x86_64的CPU,浮点运算单元就是80位的
你变量可以是96位或者128位,但是后面的啥都没有

【在 l*********i 的大作中提到】
: 啊,太感谢了,果然,用#define double long double好像就搞定了。
avatar
c*e
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好像就搞定了。
avatar
l*i
8
哦,原来是这样,长知识了,呵呵。

【在 t****t 的大作中提到】
: 就是说,x86/x86_64的CPU,浮点运算单元就是80位的
: 你变量可以是96位或者128位,但是后面的啥都没有

avatar
l*i
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位,但是后面的啥都没有

avatar
t*t
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

avatar
l*i
11
多谢多谢,也就是说如果我比较在意精度,又不想折腾去搞那个无限精度
库的话,最好的选择是用long double再选择x87的FPU?

【在 t****t 的大作中提到】
: 你再仔细读一遍, 我觉得这个说得很清楚
: SSEx做的是64b或32b的浮点运算,比x87的80位更少
: 所谓128位是说可以两个64b或者4个32b一起运算,当然会快一些。
:
: x86-
: SSE3)
: is

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。