Всегда ли функции cmath exp() и log() симметричны?

Всегда ли функции cmath exp() и log() симметричны?

Следовательно, если я это сделаю

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

будет ли утверждение когда-либо неудачным, и в этом случае: при каких обстоятельствах? Мы можем предположить, что x является рациональным числом > 0.


person fickludd    schedule 04.06.2013    source источник
comment
ошибка округления и ошибка представления.   -  person BLUEPIXY    schedule 04.06.2013
comment
Обратите внимание, что все значения, которые может принимать x, являются рациональными (кроме NaN/inf).   -  person Oliver Charlesworth    schedule 04.06.2013
comment
Пожалуйста, задайте свой вопрос о гарантиях log и exp в разных системах в другом посте Stack Overflow. Задавать два вопроса в одном сообщении проблематично, потому что респонденты могут отвечать на разные вопросы отдельными ответами, и вы можете отметить только один из них как принятый. Если кратко, то текущие математические библиотеки различаются по качеству и конкретным реализациям, поэтому результаты не совсем одинаковы от платформы к платформе.   -  person Eric Postpischil    schedule 04.06.2013
comment
@OliCharlesworth да, поэтому рационально   -  person fickludd    schedule 04.06.2013
comment
@EricPostpischil Готово.   -  person fickludd    schedule 04.06.2013


Ответы (2)


Число с плавающей запятой log не может быть однозначно. Он должен быть монотонно возрастающим и удовлетворять log(64) > 4.15 и log(128) < 4.86. Между 64 и 128 есть 252 doubles, но между 4,15 и 4,86 ​​меньше 250 doubles. В этом диапазоне есть несколько doubles с одним и тем же логарифмом с двойной точностью, поэтому exp(log(x)) == x должен дать сбой хотя бы для одного из них.

person tmyklebu    schedule 04.06.2013
comment
Сказать, что 3•2**50 — это «по крайней мере один», будет небольшим преуменьшением. :-) - person Eric Postpischil; 04.06.2013
comment
С учетом этого мне кажется, что после серии exp(log()) результат может сместиться на несколько битов от исходного значения, но симметричные удвоения должны быть довольно частыми, и как только вы нажмете еще один вызов exp(log()), он будет точным. Действительный? - person fickludd; 04.06.2013
comment
@fickludd: я не знаю. Я также предположил бы, что это так, но я не думаю, что смогу подкрепить свою интуицию чем-то строгим. - person tmyklebu; 05.06.2013

Они не более симметричны, чем * и /. При работе с числами с плавающей запятой возникают ошибки округления, поэтому x и y могут отличаться в 15-й (или около того) цифре.

person Klas Lindbäck    schedule 04.06.2013
comment
тогда они менее симметричны, чем * и /? - person fickludd; 04.06.2013