我有这个问题,在我的脑海中最后天,我挣扎短语我的问题。不过,我想我已经钉我想知道是什么。

<强>为什么C#接受通过使用浮点存储数据不准确?什么是使用它比其他方法的好处?

例如,Math.Pow(Math.Sqrt(2),2)并不确切在c#。有编程语言,可以准确计算它(例如,数学)。

我能想到的一个说法是,正是计算是很多,然后慢只是不准确应对,但数学和Matlab的用于计算巨大的科学问题,所以我觉得很难相信,这些语言确实显著慢比C#。

那么,为什么呢?

PS:我对不起你滥发带着这些问题,你一直非常有帮助

有帮助吗?

解决方案

  

为什么C#接受通过使用浮点存储数据不准确?

“C#”不接受超过精度性能的折衷;用户这样做,或者不这样做,接受

C#有三个浮点类型 - 浮动,双和小数 - 因为这三种类型的满足绝大多数的现实世界的程序员的需要。

float和double是“科学”计算,其中一个答案是正确三个或四个小数位总是接近不够好,因为这是原来的测量,将与精度。假设你除以3 10.00并获得3.333333333333。由于原始测量可能是精确到只有0.01,一个事实,即计算结果是关闭的小于0.0000000000004是无关紧要的。在科学计算,你不知道代表将要-确切数量。 不精确在第十五小数位是不相关的,如果原始测量值仅为精确到小数点后第二位

这当然不是真正的财务计算的。到金融计算操作数通常精确到小数点后两位的和表示确切数量即可。小数为“财经”计算好,因为小数运算结果的确切条件是所有的输入和输出可以完全按照小数来表示(和他们都在一个合理的范围内)。小数仍然有舍入误差,当然,但是是精确的操作,正是那些你可能想这样做财务计算时是准确的。

  

和什么是使用它比其他方法的好处?

您应该说明你想比较反对什么其他的方法。有一本关于计算机进行计算许许多多不同的技术。

  

例如,Math.Pow(Math.Sqrt(2),2)不准确在c#。有编程语言,可以准确计算它(例如,数学)。

让我们在这一点上清晰;数学不“计算”根2完全相同;数目是不合理的,因此它不能被精确地在存储的任何有限的量来计算。相反,数学是什么做的是它代表了数字作为描述数字是如何生产出来的物品。如果你说“给我两个平方根”,然后数学本质上分配一个对象,它的意思是“平方根运营商的应用程序的确切数量2”。如果这时方认为,它有,说:“如果你多东西,是别的东西平方根,还给原来的值”特殊目的逻辑。数学有代表各种特殊号码,以及像PI或E,以及规则这些数字的各种操作是如何结合在一起庞大的身躯对象。

基本上,它是一个符号系统;它操纵数字相同的方式,当他们这样做的铅笔和纸数学的人做的。大多数计算机程序操作数字就像一个计算器:立即执行的计算和圆其关闭。如果这是不能接受的,那么你应该坚持一个符号系统。

  

我能想到的一个说法是,正是计算是很多,然后慢只是不准确应对,但数学和Matlab的用于计算巨大的科学问题,所以我觉得很难相信,这些语言确实显著慢比C#。

这并不是说他们是慢,虽然浮点乘法真的是令人难以置信的快速上现代化的硬件。它是符号计算引擎是非常复杂的。它编码的基本数学的所有的规则的,而且有很多的这些规则! C#不打算成为一个专业级的符号计算引擎,它的意图是通用编程语言。

其他提示

一个字:性能。浮点运算的硬件上通常被实现并且是许多个数量级比其他方法更快。

更重要的是你的MATLAB的例子是伪造的。 MATLAB使用双精度浮点算术就像C#。

  

为什么C#通过使用浮点存储数据接受不准确性?

此方式,浮点支持可以映射的方式硬件支持浮动点,那就是 - 它是或多或少的硬件以浮点运算的优势,这是的唯一途径比软件解决方案快。其缺点是硬件表示浮动点具有有限数量的位,这导致不准确(请注意,不准确性被很好地定义)。

表示浮点值的其它方式需要一个软件解决方案,它是显著变慢并且需要更多的空间。 “任何人”可以实现什么在C#中的可用,包括对现有的硬件原生浮点支持,将是非常困难的“人”,如果这是不是已经在语言/ CLR支持。

有关大多数编程问题,不准确性是没有问题的和float(或double)数据类型是足够好的。很多年以前,有没有这样的东西作为“浮点值”和软件有这样的值存储为两个整数。和性能的的问题(不提的编程错误 - 而跆拳道的场景 - 从定制的浮点运算功能)。因此,公约的设计和用电脑装备了后很快 FPU 秒。

现在,当使用FPU用于计算或使用其它数学librairies /程序(如数学)取决于问题。例如,在3D环境中计算顶点喜欢在精确的性能。但会计软件是不同的。在这方面,两个问题不同;会计软件不会需要计算复数每秒百万秒再乘以:)(修改:或者,如果确实如此,一些非常昂贵的硬件可能会是其中的一部分也行)

如果您的知道的,你会做Math.pow(Math.sqrt(2),2),那么你应该重新考虑您存储两个值(如每次重新计算它们)的方式。这不是编程语言的问题,但更多的是概念性的问题。

C#和最所有其他语言(除具体的,像Matlab)存储浮点数作为固定大小的字段(6或8个字节),这导致不准确。

一个原因是,数字和数字格式是明确的和普遍的。是的,有舍入误差,但都是恒定的和可预测的。试图建立一个通用格式为任何算法问题是不平凡的。

我不认为这是C#问题。 C#是一种通用语言,并为您提供了基本数据类型一起玩。如果你不是很满意,你总是可以创建自己的。

此外C#不是谁接受不准确性的一个。程序员一样。对于大的一组问题误差是可接受的。当精确的结果,预计不应该使用浮动,但这个不是语言的设计师为程序员的决定。

scroll top