多年前,我学会了浮子精度问题的难点,所以我放弃使用它们。但是,我仍然使用浮点运算代码,这让我感到畏缩,因为我知道有些计算会不准确。
那么,何时适合使用浮动?
修改 作为信息,我不认为我遇到过一个数字准确性不重要的程序。但我有兴趣听一些例子。
答案 0 :(得分:53)
简短回答:当您确切知道自己在做什么以及为什么这样做时,您只需要使用 float 。
据我所知,很长的回答:浮动(而不是双打)在3D API之外不再使用了。浮动和双打在现代CPU上具有相同的性能特征,双打更大,这就是全部。如果有疑问,请使用double。
哦,是的,当然,使用十进制进行财务计算。
答案 1 :(得分:11)
在一般情况下,所有浮点计算都是不准确的,浮点数比双精度浮点数多。如果您想了解更多信息,请阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic
至于何时使用浮动 - 当精度不如保存记忆时,它们经常被使用。例如,视频游戏中的简单粒子模拟。
答案 2 :(得分:8)
首先,如果要精确表示十进制值,请不要使用浮点数或双精度数 - 使用整数类型(int,long等)或十进制(这只是一个带缩放因子的整数类型)。浮点数和双精度数在内部转换为基数2中的指数表示,并且在基数10中以指数表示精确表示的数字通常不能精确表示。 (例如,数字10仅代表浮动或双打)。
其次,就精确度而言,这取决于您的需求。我不同意你的观点,即从来没有计算精度无关紧要。您通常有一个特定的需求,您的最终结果准确地说,3位数。如果您的输入仅具有有限的精度,那么寻找最高精度是没有意义的 - 例如,您称重约5g面粉,并且您的秤仅具有0.5g的精度。也就是说,中间计算通常会从更高的精度中受益,但如果经常加速则比高精度更重要。
第三,当在一个循环中执行一系列计算时,你需要知道在处理任何不精确的计算时你在做什么 - 你会产生四舍五入的错误,而某些算法可能无法得到任何答案。精度。详细了解这些问题可能需要数学分析课程。这不取决于您是否为计算选择浮点数或双精度数。
对于浮点计算,我通常使用双精度,因为它们比浮点数更通用且更快。但是,浮点数较小,如果您需要存储大量浮点数,则可以选择防止由于缓存未命中而导致的性能问题。
据我所知,浮点处理在硬件中支持双精度但不支持浮点数,因此使用浮点数会导致转换为双精度。但是,当你传递一个浮点数时,一些例程会在迭代计算一个值时停止,因为这意味着你只需要大约8位精度而大约16位双精度。
答案 3 :(得分:7)
在许多情况下,您可能希望使用float
。然而,我不明白的是你可以使用的东西。如果您的意思是使用double
代替float
,那么,在大多数情况下,您希望这样做。但是,double
也会出现精确问题。只要准确性很重要,您就应该使用decimal
。
float
和double
在许多应用程序中非常有用。 decimal
是一种昂贵的数据类型,其范围(它可以表示的最大数量的大小)小于double
。计算机通常对这些数据类型具有特殊的硬件级别支持。它们在科学计算中被大量使用。基本上,它们是您要使用的主要小数数据类型。但是,在货币计算中,精度非常重要,decimal
是可行的方法。
答案 4 :(得分:5)
我能想到的最常见的原因是节省空间。并不是说这通常值得担心,但在某些情况下这很重要。 float占用的内存是double的一半,因此在同一空间中可以获得两倍的内存。例如,我有一个数组的数组太大而不适合RAM作为双精度但适合作为数组浮点数。
答案 5 :(得分:5)
实际上有一件事情仍然是常见的使用浮动aka 32位“单精度”:图形应用和打印。
另一个原因是带有GPU的图形卡。数据类型越小,速度越快 操作,因为必须运输较少的比特。整数数据类型存在问题 具有高动态范围图像:眼睛能够在光度范围内发挥作用 1:10 ^ 13并且识别ca. 4000级。因此,虽然整数数据类型可以存储它们无法存储背景亮度的级别数,而浮点数没有问题。事实上,IEEE 754R允许一个新的“半精度”浮点数,具有16位和10位 尾数会失去一些精确度,但会提高速度。 OpenGL和DirectX,例如广泛使用浮动。 眼睛非常宽容,所以没有问题。
所有其他建立在图形上的媒体都是继承花车作为方便的措施。 尾数具有24位,因此允许2 ^ 24 = 16,700百万个连续步骤。 如果您的打印机分辨率为2000 dpi,则仍可以打印213x213 m 床单。绰绰有余。
答案 6 :(得分:3)
使用float获取性能和大小。如果可以管理精度损失。
虽然现代处理器确实需要相同的时间来处理单精度和双精度操作,但如果使用带有SIMD的浮点数(MMX / SSE /),有时可以两次吞吐量等x86)说明。
SSE寄存器为128位宽,可以容纳 4个浮点数或 2个双倍。因此,如果使用正确,与双精度相比,您可以使用浮点数执行两倍的操作。
在处理非常大的数据集时,尺寸减小(4个字节而不是8个)变得很重要(并且由于缓存等原因,尺寸减小通常也会提高性能)