Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于需要精确到.00001的翻译,十进制或双精度会更好吗?_C#_.net_Double_Decimal_Trigonometry - Fatal编程技术网

C# 对于需要精确到.00001的翻译,十进制或双精度会更好吗?

C# 对于需要精确到.00001的翻译,十进制或双精度会更好吗?,c#,.net,double,decimal,trigonometry,C#,.net,Double,Decimal,Trigonometry,我是一家机械厂的检查员。我有一个由另一个检查器生成的html报告,其中有一些问题需要修复。这不是第一次:我需要比PowerShell和RegEx更好的东西。(不用担心网络战士,我知道我不应该用RegEx来表示html。我现在用的是HtmlAgilityPack) 我知道在SO和互联网上有很多类似的讨论。我没有发现任何如此具体的东西。我可以编写一些小的实验应用程序来测试其中的一些(我也计划这么做),但是,在我实现所有这些之前,我想知道它在未来是否安全。尽管我不是程序员,但我对我们谈论的概念有很好的

我是一家机械厂的检查员。我有一个由另一个检查器生成的html报告,其中有一些问题需要修复。这不是第一次:我需要比
PowerShell
RegEx
更好的东西。(不用担心网络战士,我知道我不应该用
RegEx
来表示html。我现在用的是
HtmlAgilityPack

我知道在SO和互联网上有很多类似的讨论。我没有发现任何如此具体的东西。我可以编写一些小的实验应用程序来测试其中的一些(我也计划这么做),但是,在我实现所有这些之前,我想知道它在未来是否安全。尽管我不是程序员,但我对我们谈论的概念有很好的理解;别担心在我头上讲话

在一系列的转换过程中,我可能会有超过0.0001的错误吗?那么.00001呢?
-如果报告的对齐关闭,我可能需要多次旋转和平移它。
-目前我只实现了旋转和平移,但我计划添加更多的转换,这可能会增加操作的数量和复杂性。
-整数分量可以达到数千。
-我们的仪器通常经0.0001认证。适用于科学测量的正常有效数字规则

Decimal
和手动编写trig函数的开销是否会非常耗时(编辑:在运行时)?
-通常,一份报告有100到100个点。每个点实际上是两个点:
标称值
(按模型)和
实际值
(按测量值)。
-最容易测试,但在实现十进制的数学函数之前我想知道

附带问题:
我有一个点类,
Point3D
,它包含
x
y
z
。由于每个数据点是其中的两个(标称值和实际值),因此我有一个类,
MeasuredPoint
,有两个
Point3D
实例。必须有一个比
MeasuredPoint
更好的名称,它不会太长


哦,是的,这是C/.Net。谢谢,

如果你需要在多个操作中保持精确性,那么你真的应该考虑使用十进制。虽然可以短时间保存数字,但随着应用的操作数的增加,没有IEEE754支持的浮点格式可以无限期地保持其值。

尝试寻找一个可以满足您需求的库。我在半心半意的寻找中偶然发现了。我过去肯定遇到过其他人。

浮点数和双打是快速近似值,就是这样。

除了
0.0
1.0
,您甚至无法获得大多数常量的精确表示形式(例如
0.1
)。因此,如果你必须保证一定的精度,使用浮点运算是不可取的


但是,如果目标是达到一定的精度,给或拿一点,那么double就可以了。请注意。

因为您讨论的是旋转、平移以及三角函数,所以可以安全地假设您所讨论的值不是0.0001的精确倍数

基于这一假设:

  • 对于小数,在每一步之后,基本上都将舍入到0.0001(或您选择的精度),并且这些舍入误差将累积

  • 双精度值通常会更精确:您将以所有可用精度在内部存储,并在显示结果时四舍五入到四位小数

例如,作为旋转或变换的结果,您希望移动1/3(0.333…)的距离。你想把这个动作重复三次

如果将距离存储为小数点后四位(0.3333),则总和为0.9999,误差为0.0001

如果存储为Double,则可以获得更高的精度,并且作为奖励,性能会更好


真正的小数通常只用于财务计算,计算结果需要精确地四舍五入到固定的小数点后十位。

坦率地说,我认为浮点是数据处理中的一个错误方向。因为人们使用十进制,而输出总是转换成十进制,所以浮点运算只会导致连续的问题。当一个变量可以保存一个大范围的值时,比如从1E-9到1E9的范围,我使用float,并使用在代码中管理的小数位数固定的整数。现在有了Java BigDecimal类和其他语言中的类似功能,几乎没有理由使用float。也许在一个需要进行大量计算且性能是个问题的环境中,您会接受舍入问题。我想我至少十年没有在程序中使用过浮点。

不要用十进制实现trig函数!标准库没有提供它们是有原因的,这是因为如果您使用trig,Decimal不会提供任何额外的好处

因为你将以弧度为单位工作,所以你的值被定义为π的倍数/比率,这在任何基本系统中都无法表示。强制表示以10为基数更可能增加而不是减少错误

如果精度(ulps中的最小误差)对您的应用程序很重要,那么您必须阅读David Goldberg的文章。那篇文章比我解释得好得多

然而,结果是,如果您想要的精度只有5位小数,那么即使是32位浮点(IEEE-754单精度)也足够了。64位双精度IEEE-754双精度将帮助您更精确地处理错误项,但128位10进制浮点值只会降低性能,几乎肯定不会