4

我是一家机械厂的检查员。我有一个由另一个检查员生成的 html 报告,其中有一些我需要解决的问题。这不是第一次了:我需要比PowerShelland更好的东西RegEx。(不要害怕互联网战士,我知道我不应该使用RegExhtml。我现在正在使用HtmlAgilityPack。)

我知道有很多关于 SO 和一般互联网上的类似讨论。我没有找到这么具体的东西。我可以编写一些小型实验应用程序来测试其中的一些(并且我计划这样做)但是,我想在实现所有这些之前了解它是否会在未来安全。尽管我不是专业的程序员,但我很好地掌握了我们正在谈论的概念;别担心在我头上说话。

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

手动编写三角函数的开销是否Decimal会非常耗时(编辑:在运行时)?
- 通常一份报告有 100 到 100 分。每个点实际上是 2 点:(Nominal建模)和Actual(测量)
-最容易测试,但我想知道在实现 Decimal 的数学函数之前。

附带问题:
我有一个点类,Point3D,它持有xy并且z。因为每个数据点都是其中的两个(theNominalActual.),所以我有一个类,MeasuredPoint,有两个Point3D实例。必须有一个更好的名字MeasuredPoint,而不是烦人的长。

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

4

6 回答 6

5

不要用小数实现三角函数!标准库不提供它们是有原因的,那就是如果你在做三角,Decimal 不会提供任何额外的好处。

由于无论如何您都将以弧度工作,因此您的值被定义为 PI 的倍数/比率,这在任何基本系统中都无法表示。强制表示以十为底更可能增加而不是减少错误。

如果精度(ulps 中的最小误差)对您的应用程序很重要,那么您必须阅读David Goldberg的 What Every Computer Scientist Should Know About Floating-Point Arithmetic。那篇文章比我解释得好得多。

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

于 2010-01-27T19:18:31.467 回答
3

如果您需要在多个操作中保持准确性,那么您真的应该考虑使用 Decimal。虽然在短时间内保存数字可能是可以的,但没有 IEEE754 支持的浮点格式可以随着应用的操作数量的增加而无限期地维持其值。

于 2010-01-27T18:09:17.383 回答
1

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

于 2010-01-27T18:43:41.650 回答
1

由于您正在谈论旋转和平移以及三角函数,因此假设您所谈论的值不是0.0001 的精确倍数似乎是安全的。

基于这个假设:

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

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

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

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

如果您存储为双精度数,您可以获得更高的精度,并且性能会更好。

真正的小数通常仅用于财务计算,其中结果需要精确四舍五入到固定的以十为底的小数位。

于 2010-01-27T18:59:33.897 回答
0

浮点数和双精度数是快速近似值,仅此而已。

除了0.0and 1.0,您甚至不会得到大多数常量的精确表示(0.1例如)。因此,如果您必须保证一定的精度,则不能选择使用浮点运算。

但如果目标是达到一定的精度,给予或接受一点,那么 double 可能会做。只是当心失去意义

于 2010-01-27T18:47:29.603 回答
0

坦率地说,我认为 FLOAT 在数据处理方面是一个错误的转变。因为人们以十进制工作,并且输出总是被翻译成十进制,所以浮点数只会导致持续的问题。我曾经在变量可以容纳广泛的值时使用浮点数,例如从 1E-9 到 1E9 的范围,否则使用在代码中管理的具有固定小数位数的整数。现在有了 Java BigDecimal 类和其他语言中的类似功能,几乎没有理由使用浮点数。也许在您进行大量计算并且性能存在问题的环境中,您会接受舍入问题。我认为至少十年来我没有在程序中使用过浮点数。

于 2010-01-27T19:00:50.307 回答