- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在想这个问题 last few天,我正在努力表达我的问题。不过,我想我已经掌握了我想知道的内容。
为什么c#接受使用 float 存储数据的不准确性?与其他方法相比,使用它有什么好处?
例如,Math.Pow(Math.Sqrt(2),2)
在 c# 中不是精确的。有一些编程语言可以精确计算它(例如 Mathematica)。
我能想到的一个论点是,准确计算它比处理不准确要慢得多,但 Mathematica 和 Matlab 用于计算巨大的科学问题,所以我很难相信这些语言真的慢得多比 C#。
那为什么会这样呢?
PS:很抱歉向您发送这些问题,你们真的很有帮助
最佳答案
Why does c# accept the inaccuracy by using floating points to store data?
“C#”不接受性能与准确性的权衡;用户接受或不接受这一点。
C# 具有三种浮点类型 - float、double 和 decimal - 因为这三种类型可以满足现实世界中程序员的绝大多数需求。
float 和 double 适用于“科学”计算,在这种情况下,精确到小数点后三位或四位的答案总是足够接近,因为这是原始测量结果的精度。假设您将 10.00 除以 3 得到 3.333333333333。由于原始测量值可能仅精确到 0.01,因此计算结果的偏差小于 0.0000000000004 是无关紧要的。在科学计算中,您并不是在表示已知的精确数量。 如果原始测量值仅精确到小数点后第二位,则小数点后十五位的不精确度无关紧要。
这当然不适用于财务计算。财务计算的操作数通常精确到小数点后两位并表示精确的数量。小数适用于“金融”计算,因为小数运算结果是精确的,前提是所有的输入和输出都可以精确地表示为小数(并且它们都在合理的范围内)。当然,小数仍然存在舍入误差,但精确的运算恰恰是您在进行财务计算时可能希望精确的运算。
And what's the benefit of using it over other methods?
您应该说明您想与哪些其他方法进行比较。在计算机上执行计算有很多不同的技术。
For example, Math.Pow(Math.Sqrt(2),2) is not exact in c#. There are programming languages that can calculate it exactly (for example, Mathematica).
让我们明确这一点; Mathematica 不会准确地“计算”根 2;该数字是无理数,因此无法在任何有限的存储量中精确计算。相反,mathematica 所做的是将数字表示为描述数字生成方式的对象。如果您说“给我二的平方根”,那么 Mathematica 本质上分配一个对象,意思是“将平方根运算符应用到精确的数字 2”。如果您然后对其进行平方,它具有特殊目的逻辑,即“如果您对某事物进行平方,而该事物是其他事物的平方根,则返回原始值”。 Mathematica 也有代表各种特殊数字的对象,如 pi 或 e,以及关于如何将这些数字的各种操作组合在一起的大量规则。
基本上,它是一个符号系统;它处理数字的方式与人们进行纸笔数学运算时的方式相同。大多数计算机程序像计算器一样处理数字:立即执行计算并将其四舍五入。如果这是 Not Acceptable ,那么您应该坚持使用符号系统。
One argument I could think of is that calculating it exactly is a lot slower then just coping with the inaccuracy, but Mathematica & Matlab are used to calculate gigantic scientific problems, so I find it hard to believe those languages are really significantly slower than c#.
这并不是说它们更慢,尽管 float 的乘法在现代硬件上确实快得令人难以置信。就是符号计算引擎极其复杂。它编码了基础数学的所有规则,而且有很多这样的规则! C# 并非旨在成为专业级符号计算引擎,而是旨在成为一种通用编程语言。
关于c# - 在 C# 中接受浮点不准确有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4603944/
我是一名优秀的程序员,十分优秀!