Tim*_*sen 5 c# floating-point floating-accuracy
最近 几天我脑子里已经遇到了这个问题,我很难说出我的问题.但是,我想我已经钉了我想知道的东西.
为什么c#通过使用浮点来存储数据来接受不准确?使用它比其他方法有什么好处?
例如,Math.Pow(Math.Sqrt(2),2)在c#中并不精确.有些编程语言可以精确计算它(例如,Mathematica).
我能想到的一个论点是,计算它确实比仅仅处理不准确性慢得多,但Mathematica和Matlab用于计算巨大的科学问题,所以我发现很难相信这些语言真的比c#慢得多.
那么为什么呢?
PS:我很抱歉用这些问题向你发送垃圾邮件,你们都非常乐于助人
Eri*_*ert 32
为什么c#通过使用浮点来存储数据来接受不准确?
"C#"不接受性能与准确性的权衡; 用户做或不接受.
C#有三种浮点类型 - float,double和decimal - 因为这三种类型满足了现实世界程序员的绝大多数需求.
float和double适用于"科学"计算,其中对三位或四位小数正确的答案总是足够接近,因为这是原始测量所带来的精度.假设你将10.00除以3得到3.333333333333.由于原始测量值可能精确到0.01,因此计算结果偏差小于0.0000000000004这一事实无关紧要.在科学计算中,您不代表已知的准确数量.如果原始测量值仅精确到小数点后第二位,则小数点后十五位的不精确度无关紧要.
这当然不适用于财务计算.财务计算的操作数通常精确到小数点后两位并表示精确数量.十进制适用于"财务"计算,因为十进制运算结果是精确的,前提是所有输入和输出都可以精确地表示为小数(并且它们都在合理的范围内).当然,小数仍然存在舍入误差,但精确的运算正是您在进行财务计算时可能想要精确的运算.
使用它比其他方法有什么好处?
您应该说明您想要比较的其他方法.在计算机上执行计算有很多不同的技术.
例如,Math.Pow(Math.Sqrt(2),2)在c#中并不精确.有些编程语言可以精确计算它(例如,Mathematica).
我们在这一点上要明确; Mathematica没有完全"计算"根2; 这个数字是不合理的,因此无法在任何有限的存储量中精确计算.相反,mathematica所做的是它将数字表示为描述数字生成方式的对象.如果你说"给我两个平方根",那么Mathematica本质上会分配一个对象,意思是"将平方根运算符应用于精确数字2".如果你然后对它进行说明,它就有一个特殊用途的逻辑,即"如果你把某些东西放在其他东西的平方根上,那么就给出原始值".Mathematica具有代表各种特殊数字的对象,如pi或e,以及关于这些数字的各种操作如何组合在一起的大量规则.
基本上,它是一个象征性的系统; 它操纵数字的方式与人们做铅笔纸数学时的操作方式相同.大多数计算机程序操纵数字,如计算器:立即执行计算并将其四舍五入.如果这是不可接受的,那么你应该坚持使用符号系统.
我能想到的一个论点是,计算它确实比仅仅处理不准确性慢得多,但Mathematica和Matlab用于计算巨大的科学问题,所以我发现很难相信这些语言真的比c#慢得多.
虽然它们的速度并不慢,但浮点数的乘法在现代硬件上确实非常快.这是符号计算引擎非常复杂.它编码了所有基础数学规则,并且有很多这些规则!C#不是一个专业级的符号计算引擎,它旨在成为一种通用的编程语言.
Dav*_*nan 12
一句话:表现.浮点算法通常在硬件上实现,并且比其他方法快许多个数量级.
你的MATLAB实例更是虚假.MATLAB使用双精度浮点运算,就像C#一样.