Недавно я столкнулся с проблемой, что visual-c++
не соответствует IEEE 754 , но вместо этого использует субнормальное представление . То есть значения с плавающей запятой двойной точности не имеют обычного представления 1 знакового бита, 11 экспоненциальных битов и 52 явно хранимых значащих десятичных битов, см. Ниже.
Поскольку gcc
и clang
, однако, являются совместимыми, а согласованное кроссплатформенное поведение крайне желательно, я хотел бы знать, возможно ли заставить visual-c++
использовать нормальное представление. Альтернативно, использование gcc
и clang
использования субнормального представления, конечно, также решит проблему.
Проблема различных двойных представлений может быть воспроизведена в visual-c++
, gcc
и clang
с использованием следующего кода:
#include <iostream>
#include <string>
int main()
{
try {
std::stod("8.0975711886543594e-324");
std::cout << "Subnormal representation.";
} catch (std::exception& e) {
std::cout << "Normal representation.";
}
return 0;
}
Возможна ли спецификация представления для создания согласованного поведения во всех трех случаях?
Редактировать: Как указывало geza , это возникает проблема в различных реализациях std::stod
, которые затем задали бы вопрос, если есть любой способ заставить std::stod
вести себя согласованно, без необходимости использовать отдельную оболочку для него.