【发布时间】:2014-11-29 23:28:21
【问题描述】:
我有一个应用程序,由于在进行双精度数学运算时出现灾难性截断错误,我绝对必须使用 long double 数据类型。我的测试程序快疯了,因为在 Windows 上使用 Visual Studio 的 long double 只是 double 的别名,而在 linux 和 OSX 上,long double 是真正的 long double,名义上的精度为 1e-19。
在 mingw(GCC 的 windows 端口)上是我感到困惑的地方。 Mingw 声称 LDBL_EPSILON 的精度为 1e-19,但 googleing 表明 mingw 使用的 c 运行时实际上只是 microsoft c 运行时,它不支持真正的长双精度。任何人都可以在这里解释一下吗?
编辑:问题的症结在于:在mingw上,如果我调用数学函数log(long double x),这只是log(double x)的别名吗?在这两种情况下,我如何编写自己的脚本来测试这种行为和/或测试它?
【问题讨论】:
-
基本算术通常是语言的一部分,而不是
C runtime的一部分,C runtime主要是指 C 标准库的实现以及信号处理、内存分配等运行时设施。 -
但是数学函数不是 c 运行时的一部分吗?例如日志(长双)?如果我弄错了,请原谅我的无知
-
一个常见的新手错误是减去两个大致相等的数字。无论如何,先看看算法是个好主意。
-
是的,我不是新手,算法已经过大量优化以避免截断等。
-
ergo -> 我真的需要 long double