c# - 在 C# 中接受浮点不准确有什么好处

标签 c# floating-point floating-accuracy

我一直在想这个问题 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/

相关文章:

c# - 对具有空值的列表进行排序

c - C 中的 float 比较

JavaScript 将 float 显示为小数点后 2 位

c# - ORA-08103 程序错误

c# - 如何从 Serilog 中排除特定的异常类型?

python 2.5 : how to convert float to hex?

math - float 学有问题吗?

c++ - 为什么编译时浮点计算的结果可能与运行时计算的结果不同?

c++ - std::string 到 float (通过 std::stof)精度

c# - 如何在 C# 中停止文件循环?