J-1*_*DiZ 98
如果你想知道真正的答案,你应该阅读 每个计算机科学家应该知道的关于浮点运算的内容.
简而言之,尽管其表示double允许更高的精度,但对于某些计算,它会产生更大的误差."正确"的选择是:使用尽可能多的精度而不是更多,并选择正确的算法.
许多编译器无论如何都在"非严格"模式下进行扩展浮点数学运算(即使用硬件中可用的更宽浮点类型,例如80位和128位浮点),这也应该被考虑在内.在实践中,你几乎看不出速度上的任何差异 - 无论如何它们都是硬件的原生.
Tho*_*thy 39
除非您有其他特殊原因,否则请使用double.
也许令人惊讶的是,它是双重而不是浮点数是C(和C++)中的"正常"浮点类型.标准数学函数(如sin和log)将双精度作为参数,并返回双精度数.正常的浮点文字,就像在程序中编写3.14一样,类型为double.不漂浮.
在典型的现代计算机上,双精度可以像浮点数一样快,甚至更快,因此即使对于大型计算,性能通常也不是要考虑的因素.(那些必须是大型计算,否则性能甚至不应该进入你的脑海.我的新款i7台式电脑可以在一秒内完成60亿次双倍乘法.)
Ski*_*izz 27
这个问题无法回答,因为这个问题没有背景.以下是一些可能影响选择的事情:
编译器实现浮点数,双精度数和长双精度数.C++标准规定:
有三种浮点类型:float,double和long double.double类型提供至少与float一样多的精度,long double类型提供至少与double一样多的精度.
所以,这三个在内存中的大小可以相同.
存在FPU.并非所有CPU都具有FPU,有时会模拟浮点类型,有时不支持浮点类型.
FPU架构.IA32的FPU内部为80位 - 32位和64位浮点数在负载时扩展到80位,并在存储时减少.还有SIMD可以并行执行四个32位浮点数或两个64位浮点数.标准中未定义SIMD的使用,因此需要编译器执行更复杂的分析以确定是否可以使用SIMD,或者需要使用特殊功能(库或内在函数).80位内部格式的结果是,您可以获得稍微不同的结果,具体取决于数据保存到RAM的频率(因此,精度会降低).因此,编译器不能很好地优化浮点代码.
内存带宽.如果double需要比float更多的存储空间,那么读取数据需要更长的时间.这是天真的答案.在现代的IA32上,这一切都取决于数据的来源.如果它在L1高速缓存中,则只要数据来自单个高速缓存行,负载就可以忽略不计.如果它跨越多个缓存行,那么开销很小.如果它来自L2,它需要一段时间,如果它在RAM中那么它仍然更长,最后,如果它在磁盘上是一个巨大的时间.因此,float或double的选择不如数据的使用方式重要.如果要对大量顺序数据进行小型计算,则最好使用小数据类型.在小型数据集上进行大量计算将允许您使用具有任何显着效果的更大数据类型.如果您非常随机地访问数据,那么数据大小的选择并不重要 - 数据会加载到页面/缓存行中.因此,即使您只想从RAM中获取一个字节,也可以传输32个字节(这非常依赖于系统的体系结构).除此之外,CPU/FPU可以是超标量(也称为流水线).因此,即使负载可能需要几个周期,CPU/FPU也可能忙于执行其他操作(例如乘法),将负载时间隐藏到一定程度.
该标准不强制浮点值的任何特定格式.
如果您有规格,那么这将指导您进行最佳选择.否则,它将体验到使用什么.
luc*_*luc 15
Double更精确,但编码为8个字节.float只有4个字节,因此空间更小,精度更低.
如果您的应用程序中有双重浮动,则应该非常小心.我过去因此而犯了一个错误.代码的一部分是使用float,而其余的代码是使用double.将double复制到float然后浮动到double会导致精度错误,从而产生很大的影响.就我而言,它是一家化工厂...希望它没有产生戏剧性的后果:)
我想,正是因为这种虫子,几年前阿丽亚娜6号火箭爆炸了!
仔细考虑变量使用的类型