Я реализовал достаточно сложный численный алгоритм. Он содержит некоторые экспоненты, среди которых я обнаружил, при печати промежуточного результата, что были некоторые переполнения двойной. Однако терминал распечатывает inf
(не Inf
или NaN
), и кажется, что это не двойной, даже минимальный или максимальный выразительный двойной. Но кажется, что inf
ведет себя так, как если бы это была расширенная система с реальными числами (перспектива, что положительная и отрицательная бесконечность должна рассматриваться как истинное число, а не аббревиатура утверждения с ограничениями).Действительно ли C++ std inf ведет себя точно так же, как общ-чувствительная бесконечность
Я провел тест: (г ++ версии: "Apple LLVM версии 8.0.0 (лязг-800.0.42.1)")
#include <iostream> // cout
#include <cmath> // exp, log
#include <limits> // data ranges
int main(void)
{
const double dMin =std::numeric_limits<int>::min();
const double dMax =std::numeric_limits<int>::max();
double p1 =std::exp(710);
double p2 =std::exp(750);
double p3 =std::exp(800);
double p4 =-std::log(0.0);
std::cout << "p1 :=std::exp(710) =" << p1 << '\n';
std::cout << "p2 :=std::exp(750) =" << p2 << '\n';
std::cout << "p3 :=std::exp(800) =" << p3 << '\n';
std::cout << "p4 :=-std::log(0.0) =" << p4 << '\n';
std::cout << "does p1==dMax? " << ((p1==dMax) ? "yes" : "no") << '\n';
std::cout << "does p1==-dMin? " << ((p1==-dMin) ? "yes" : "no") << '\n';
std::cout << "does p1==p2? " << ((p1==p2) ? "yes" : "no") << '\n';
std::cout << "does p2==p3? " << ((p2==p3) ? "yes" : "no") << '\n';
std::cout << "does p3==p4? " << ((p3==p4) ? "yes" : "no") << '\n';
std::cout << "does 3*p1==p2/2+1? " << ((3*p1==p2/2+1) ? "yes" : "no") << '\n';
std::cout << "does (-p1)*(-p2)==p3*p3*p3? " << (((-p1)*(-p2)==p3*p3*p3) ? "yes" : "no") << '\n';
std::cout << "does std::log(p2)==std::exp(p3)? " << ((std::log(p2)==std::exp(p3)) ? "yes" : "no") << '\n';
}
Выход:
p1 :=std::exp(710) =inf
p2 :=std::exp(750) =inf
p3 :=std::exp(800) =inf
p4 :=-std::log(0.0) =inf
does p1==dMax? no
does p1==-dMin? no
does p1==p2? yes
does p2==p3? yes
does p3==p4? yes
does 3*p1==p2/2+1? yes
does (-p1)*(-p2)==p3*p3*p3? yes
does std::log(p2)==std::exp(p3)? yes
Кажется, что inf
похоже на нашу концепцию бесконечности, но не равную max и min std.
Безопасно ли тогда считать, что inf
работает так же, как общность-чувственная бесконечность? Могу ли я полагаться на операции на промежуточных этапах моего алгоритма, который включает в себя inf
, считая его истинной бесконечностью и только в конце концов справляется с его результатами? Или, если нет, следует ли его поймать? Но как я могу, поскольку это не максимальный или минимальный двойной?
«общего бесконечности бы бессмысленно», я нахожу, что это трудно сдержать свой смех прямо сейчас: D – George
хорошо я не родной английский пользователь QQ – Aminopterin
^^ это не английский, просто утверждение, что существует бы бессмысленно бесконечность. – George