何时使用浮动

多年以前,我学会了用浮动的精度问题,所以我不再使用它们。 然而,我仍然遇到代码使用浮动,这让我畏惧,因为我知道一些计算将是不准确的。

那么,什么时候适合使用浮动?

编辑:作为信息,我不认为我已经遇到了一个程序,其中一个数字的准确性并不重要。 但是我会对听到的例子感兴趣。

简短的回答:你只需要使用浮动,当你知道你在做什么,为什么。

长的答案:据我所知, 浮动 (而不是双打 )在3D API之外不再被使用。 在现代的CPU上,浮动和双打具有相同的性能特征,双打比较大,就这些了。 如果有疑问,只需使用双。

哦,是的,当然,使用小数进行财务计算。

所有的浮点计算在一般情况下都是不准确的,浮点数比双精度浮点数多。 如果你想了解更多信息,请阅读“ 计算机科学家关于浮点算术应该知道些什么”

至于什么时候使用浮点数 – 当精度不如保存内存时,通常使用浮点数。 例如video游戏中的简单粒子模拟。

有很多情况下你会想要使用float 。 但是我不明白的是你可以用什么来代替。 如果你的意思是使用double而不是float ,那么在大多数情况下,你想这样做。 但是, double也会有精确的问题。 每当精度很重要时,您应该使用decimal

floatdouble在许多应用程序中非常有用。 decimal是一种昂贵的数据types,它的范围(它可以表示的最大数量级)小于double 。 计算机通常对这些数据types具有特殊的硬件级别支持。 他们在科学计算中使用了很多 。 基本上,它们是您要使用的主要部分数据types。 然而,在货币计算中,精度是非常重要的, decimal是要走的路。

首先,如果要精确地表示十进制值,请不要使用浮点数或双精度 – 使用整数types(int,long等)或decimal(只是具有缩放因子的整数types)。 浮点数和双精度值在内部转换为基数2中的指数表示,并且精确地以基数10中的指数表示表示的数字通常不能精确表示。 (例如,数字10只能用浮标或双打来表示)。

其次,就精度而言,这取决于你所需要的。 我不同意你的观点,即从来没有精确度无关的计算。 你通常有一个特定的需要,你的最终结果是准确的说,3位数字。 如果您的input精度有限,寻找最高的精确度是没有意义的 – 比如称重5克的面粉,而您的秤只有0.5克的精确度。 也就是说,中间计算通常受益于更高的精度,但是如果经常加快速度,那么比高精度更重要。

第三,当执行一系列的计算时,比如说在一个循环中,在处理任何不精确的计算时,你需要知道你在做什么 – 你将会产生舍入误差,并且一些algorithm可能无法得到任何精度的答案。 详细了解这些问题可能需要数值分析课程。 这不取决于你是否select花车或双打计算。

对于浮点计算,我通常会使用双精度,因为它们比浮点更一般和更快。 但是,浮点数较小,如果需要存储大量浮点数,则可以select这些浮点数来防止由于caching未命中而导致的性能问题。

据我所知,浮点处理在硬件中支持双精度浮点运算而不是浮点运算,因此使用浮点运算会导致双精度转换。 然而,当你传递一个浮点数时迭代计算一个值时,一些例程会停止更快,因为这意味着你只需要大约8个数字的精度而大约16个双精度。

我能想到的最常见的原因是为了节省空间。 这并不是说这常常值得担心,但在某些情况下它很重要。 浮动内存占用了一倍,所以你可以在同一个空间内获得两倍的内存。 例如,我有一个数组的数组太大,无法放入内存作为双打,但适合作为一个数组浮动。

实际上有一件事情,即使用浮点数(32位)的“单精度”浮点数仍然很常见:graphics应用程序和打印。

另一个原因是graphics卡与他们的GPU。 数据types越小,操作越快,因为必须传输更less的位。 整数数据types在高dynamic范围图像方面存在问题:眼睛能够在1:10 ^ 13的光度范围内运行,并识别ca。 4000级。 所以虽然整数数据types可以存储级别的数量,他们无法存储背景亮度,而浮动没有问题。 事实上,IEEE 754R允许一个新的“半精度”浮点16位和10位尾数,这会损失一些精度,但会允许更大的速度。 OpenGL和DirectX例如广泛地使用浮动。 眼睛是非常宽容的文物,所以在那里没有问题。

所有其他媒体build立在graphics上的inheritance花车作为方便的措施。 尾数有24位允许2 ^ 24 = 16,7百万连续的步骤。 如果您拥有2000 dpi分辨率的打印机,您仍然可以打印213×213 m的纸张。 绰绰有余。

使用浮动性能和大小 。 如果你能pipe理精确度损失。

虽然现代处理器的处理时间相当于处理单精度和双精度运算的确是如此,但如果使用带有SIMD(x86上的MMX / SSE /等)指令的浮点数,则有时可以获得两倍的吞吐量。

SSE寄存器是128位宽,可以容纳4个浮点数2个双精度 浮点数 。 因此,如果使用正确的话,与双打相比,你可以用浮点数执行两倍的操作。

在处理非常大的数据集时,尺寸减小(4个字节而不是8个)变得很重要(并且由于caching等原因,尺寸减小通常也提高了性能)