问题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
相距多远应该让人担心结果?
答案 0 :(得分:2)
在这个答案中,我解决了系统之间的差异,而不是exp(log(x))
的往返。如您的其他问题所示,即使exp
和log
的最佳实施方式,往返结果通常也不等于输入。
在实践中,无法保证数学库函数的准确性,不同的提供者使用不同的算法和近似值,因此结果因平台而异。
最好的商业图书馆旨在实现亚ULP准确性,这意味着每个结果都在精确数学结果的最后位置(浮点格式)的一个单位内。对于数学库中的一些更深奥的函数,通常无法实现这一点。并非所有图书馆都以此为目标。即使两个不同的库都保证了子ULP的准确性,它们也不会总是返回相同的结果。
有一个学术项目CRlibm,其目标是提供数学库例程的正确舍入实现。正确舍入的实现返回唯一可表示的值,该值最接近所选舍入方法中的精确数学结果(最接近,朝向零,朝向无穷大或朝向无穷大)。考虑到浮点格式的限制,正确舍入的结果是最准确的结果。 crlibm-1.0beta3.pdf提供了log
和exp
的正确舍入实现,并提供了证据。
因为唯一定义了正确舍入的结果,所以具有正确舍入实现的两个库将返回相同的结果。
答案 1 :(得分:1)
作为一般规则,像这样的浮点运算(特别是在log
的不同实现之间),永远不能保证具有精确的反转。所以我的回答是