是否有任何情况下使用单一数据类型而不是双精度数更有意义?从我的搜索,双重的缺点是它需要更多的空间,这对大多数应用程序来说不是问题。在这种情况下,所有浮点数应该是双倍的吗?
一些背景信息: 我正在处理一个处理大量有关坐标和化学品数据的应用程序。一些客户注意到,在导入数据电子表格时,一些高精度值会向下舍入单个精度。
答案 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上并不确定。
我最喜欢的就是单精度足以导航到月球和背部,所以在实践中引起真正的问题是不寻常的。这说在大多数情况下我现在达到了双倍,因为存储很便宜,并且不太可能是任何奇怪的二进制到十进制问题。