c语言对称在不同的cmath log()和exp()实现中?

时间:2013-06-04 19:42:16

标签: c math cmath

问题Are cmath exp() and log() functions always symmetrical?

的后续行动
double x;
double y = exp(log(x));
assert(x == y);

基本上,如果将log(x)写入磁盘并在另一个系统上计算exp() - c语言在多大程度上保证对称性?考虑到可能在不同系统上的一长串exp(log()),与原始x相距多远应该让人担心结果?

2 个答案:

答案 0 :(得分:2)

在这个答案中,我解决了系统之间的差异,而不是exp(log(x))的往返。如您的其他问题所示,即使explog的最佳实施方式,往返结果通常也不等于输入。

在实践中,无法保证数学库函数的准确性,不同的提供者使用不同的算法和近似值,因此结果因平台而异。

最好的商业图书馆旨在实现亚ULP准确性,这意味着每个结果都在精确数学结果的最后位置(浮点格式)的一个单位内。对于数学库中的一些更深奥的函数,通常无法实现这一点。并非所有图书馆都以此为目标。即使两个不同的库都保证了子ULP的准确性,它们也不会总是返回相同的结果。

有一个学术项目CRlibm,其目标是提供数学库例程的正确舍入实现。正确舍入的实现返回唯一可表示的值,该值最接近所选舍入方法中的精确数学结果(最接近,朝向零,朝向无穷大或朝向无穷大)。考虑到浮点格式的限制,正确舍入的结果是最准确的结果。 crlibm-1.0beta3.pdf提供了logexp的正确舍入实现,并提供了证据。

因为唯一定义了正确舍入的结果,所以具有正确舍入实现的两个库将返回相同的结果。

答案 1 :(得分:1)

作为一般规则,像这样的浮点运算(特别是在log的不同实现之间),永远不能保证具有精确的反转。所以我的回答是

  1. 肯定会有一些损失,
  2. 如果你真的关心多少,你应该实施它并运行测试,
  3. 这真的闻起来好像是你想做的事情,并且有办法解决问题,在这种情况下我会问:你想做什么,为什么你首先遇到这个问题?