我正在编写一个应用程序,它读取大量浮点数并用它们执行一些简单的操作。我使用浮点数,因为我认为它比双精度更快,但经过一些研究后,我发现这个主题存在一些混乱。谁能详细说明一下吗?
简短的答案是,“使用可接受的结果所需的任何精度。”
您的一项保证是,对浮点数据执行的操作至少在表达式的最高精度成员中完成。所以乘以二float的精度至少为float,并乘以float and a double至少会以双精度完成。该标准规定“[浮点]运算的执行精度可以高于运算结果类型的精度”。
鉴于 .NET 的 JIT 试图让浮点运算保持所要求的精度,我们可以查看 Intel 的文档来加速我们的运算。在 Intel 平台上,您的浮点运算可以以 80 位的中间精度完成,并转换为所需的精度。
From Intel's guide to C++ Floating-point Operations1 (sorry only have dead tree), they mention:
- 使用单精度类型(例如 float),除非需要通过 double 或 long double 获得额外的精度。更高精度的类型会增加内存大小和带宽要求。
...
- 避免混合数据类型算术表达式
最后一点很重要,因为你可以通过不必要的 float 和 double 转换来减慢自己的速度 http://weblog.ikvm.net/PermaLink.aspx?guid=f300c4e1-15b0-45ed-b6a6-b5dc8fb8089e,这会导致 JIT 代码要求 x87 在操作之间放弃其 80 位中间格式!
1. 是的,它说的是 C++,但是 C# 标准加上 CLR 的知识让我们知道 C++ 的信息应该适用于这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)