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