单对双数据类型

时间:2009-12-08 18:00:28

标签: types floating-point double

是否有任何情况下使用单一数据类型而不是双精度数更有意义?从我的搜索,双重的缺点是它需要更多的空间,这对大多数应用程序来说不是问题。在这种情况下,所有浮点数应该是双倍的吗?

一些背景信息: 我正在处理一个处理大量有关坐标和化学品数据的应用程序。一些客户注意到,在导入数据电子表格时,一些高精度值会向下舍入单个精度。

6 个答案:

答案 0 :(得分:4)

来自this .net文章

  

数据类型宽度

     

最有效的数据类型是   那些使用原生数据宽度的人   运行时平台。当前   平台,数据宽度为32位,   对于计算机和计算机   操作系统。

     

因此,Integer目前是   Visual中最有效的数据类型   基本的.NET。下一个最好的是长,短,   和Byte,按照效率的顺序。   你可以提高性能   通过关闭整数来缩短和字​​节   溢出检查,例如   设置RemoveIntegerChecks   财产,但这会带来风险   不正确的计算   未检测到的溢出。你不能   在此过程中打开和关闭此检查   运行;你只能设定它的价值   为你的下一个构建   应用

     

如果你需要小数值,那么   最好的选择是Double,因为   当前的浮点处理器   平台执行所有操作   双精度。下一个最好的是单身   和十进制,按顺序排列   效率

答案 1 :(得分:2)

正如马克在评论中所说,空间可能是内存受限系统的问题。您可能还想对列表进行索引或排序,如果您可以将值存储在单个列表中,为什么这样做会加倍?

答案 2 :(得分:2)

在大多数桌面应用程序上,是的。

虽然如果你有大量的它们,如果你不需要精度,那么将它的大小减半可能是值得的。

特别是考虑到几乎所有消费者桌面都有硬件完成的双精度浮点运算。

答案 3 :(得分:2)

在某些硬件上,涉及双值的算法可能比涉及单个值的算法花费的时间更长,但是最新的FPU具有单个本机数据类型(例如,x86的80位扩展浮点值),它将在内部用于计算无论您使用何种内存数据类型。也就是说,“单精度下FPU计算速度更快”通常是今天在大多数现代硬件上使用单精度的理由。

也就是说,除了在其他答案中详细阐述的“使用更少内存”的原因之外,对于像SSE和AltiVec这样的SIMD矢量指令有一个非常实际的原因 - 单精度可以快两倍作为双精度,因为指令对固定大小的矢量进行操作,并且您可以将单个精度值的两倍填充到单个矢量中,处理时间通常保持不变。

例如,对于能够在2个时钟周期内处理向量乘法的128位向量单元,您可以获得每个时钟2个单精度乘法的吞吐量,而不是1个双精度,因为您可以在向量中单个4个单一,与两个双打比赛。

类似的效果发生在内存带宽上,并不是特定于矢量处理 - 如果你有大量的双精度数组,它们不仅会占用两倍的空间,而且可能需要两倍的时间来处理您的算法受带宽限制(随着矢量处理单元的大小增加和延迟减少,这种情况越来越有可能)。

答案 4 :(得分:1)

双打占用更多空间,但额外的精度可能是必要的,也可能不是必需的。我在科学界做了很多编程,其中浮点运算是非常常见的,并且发现通常你可以以双倍或更高的精度进行计算,但是将结果存储为单身而没有不良影响。

请记住,一旦数字被吸入FPU,无论如何它们都会扩展到非常高的精度。话虽这么说,最好在两种精度上尝试你正在做的事情,看看结果是否具有可比性。

不幸的是,计算仍然是一门实验科学。

答案 5 :(得分:0)

如果您正在编写OpenGL,那么使用GLSingle(例如单个)而不是GLDouble是正常的。在几乎所有情况下,单精度对于大多数图形应用来说已经足够了,应该更快 - 尽管我承认我在最新一代GPU上并不确定。

我最喜欢的就是单精度足以导航到月球和背部,所以在实践中引起真正的问题是不寻常的。这说在大多数情况下我现在达到了双倍,因为存储很便宜,并且不太可能是任何奇怪的二进制到十进制问题。