【问题标题】:Are cmath exp() and log() functions always symmetrical?cmath exp() 和 log() 函数总是对称的吗?
【发布时间】:2013-06-04 08:39:47
【问题描述】:

cmath exp()log() 函数总是对称的吗?

如果我这样做了,那就去吧

double x;
double y = exp(log(x));
assert(x == y);

断言是否会失败,在这种情况下:在什么情况下?我们可以假设x 是一个有理数> 0

【问题讨论】:

  • 存在舍入错误和表示错误。
  • 请注意,x 可以采用的 所有 值都是有理数(NaN/inf 除外)。
  • 请在另一个 Stack Overflow 帖子中询问您关于 logexp 在不同系统上的保证的问题。在一篇文章中提出两个问题是有问题的,因为受访者可能会在不同的答案中回答不同的问题,并且您只能将其中一个标记为已接受。简而言之,当前的数学库在质量和具体实现方面各不相同,因此不同平台的结果并不完全相同。
  • @OliCharlesworth 是的,因此是理性的
  • @EricPostpischil 完成。

标签: c math cmath


【解决方案1】:

浮点 log 不能是一对一的。需要单调递增,满足log(64) > 4.15log(128) < 4.86。 64 到 128 之间有 252doubles,但 4.15 到 4.86 之间有不到 250doubles。在该范围内有多个 doubles 具有相同的双精度对数,因此 exp(log(x)) == x 必须至少其中一个失败。

【讨论】:

  • 说 3•2**50 是“至少一个”似乎有点轻描淡写。 :-)
  • 有了这个推理,在我看来,在一系列exp(log()) 之后,结果可能会从原始值移动几位,但是对称双打应该非常频繁,一旦你再打一个@ 987654329@ 电话将是准确的。有效吗?
  • @fickludd:我不知道。我也猜想会是这样,但我不认为我可以用任何严格的东西来支持我的直觉。
【解决方案2】:

它们并不比*/ 对称。处理浮点数时会出现舍入错误,因此xy 可能在第 15 位(左右)上有所不同。

【讨论】:

  • 那么它们的对称性是否不如*/
猜你喜欢
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2014-02-18
  • 2011-10-13
  • 1970-01-01
相关资源
最近更新 更多