Я сталкиваюсь с любопытной ошибкой, когда присваиваю значения long double
типам переменных. (Архитектура PowerPC, gcc v4.9.2)
Конкретно:
const constexpr long double DEGREE_TO_RAD = 0.0174532925199432954743716805978693;
const constexpr long double RAD_TO_DEGREE = 1. / DEGREE_TO_RAD;
похоже, приводит к следующей ошибке компилятора:
error: ‘(1.0e+0l / 1.74532925199432954743716805978693e-2l)’ is not a constant expression
const constexpr long double RAD_TO_DEGREE = 1. / DEGREE_TO_RAD;
Я не эксперт в C++; это программное обеспечение, которое я пытаюсь создать специально для среды моей машины разработки. Тем не менее, мои исследования привели меня к следующему лакомому кусочку:
На некоторых машинах PowerPC и SPARCv9
long double
реализуется как арифметика с двойным удвоением, где значениеlong double
рассматривается как точная сумма двух значений с двойной точностью, что дает по крайней мере 106-битную точность; с таким форматом типlong double
не соответствует стандарту IEEE с плавающей запятой. В противном случаеlong double
— это просто синонимdouble
(двойная точность). [wiki]
Это наводит меня на мысль, что сбой сборки связан с тем, что long double имеет другую интерпретацию в моей архитектуре по сравнению со стандартным x86. Изменение long double
на double
в исходном коде позволяет выполнить компиляцию. Это совпадение? Почему в этом случае g++ устроил бы истерику по этому поводу?
pi
работает... в то время как на x86 clang выручит, поскольку _2_ не является константной функцией, и gcc работает в любом случае. К сожалению, у меня нет никакого объяснения, _3_ кажется мне чем-то, что можно определенно вычислить во время компиляции, даже если с риском некоторой незначительной потери точности, об этом, возможно, стоило бы предупредить без какого-либо явного способа отметить некоторую неточность. отлично. - person Cheers and hth. - Alf   schedule 01.02.2018const constexpr long double RAD_TO_DEGREE = pow(DEGREE_TO_RAD, -1.0l);
. - person Ped7g   schedule 01.02.2018constexpr
, так что, по крайней мере, любой читающий исходный код будет знать, какая часть исходного кода нуждается в рефакторинге. ... А удаляя _2_ вы полностью меняете смысл определения. - person Cheers and hth. - Alf   schedule 01.02.2018for
? - person Ped7g   schedule 01.02.2018-frounding-math
, потому что _2_ и _3_ являются константами _4_ - person M.M   schedule 01.02.2018long double
с использованием компилятора powerpc64le. Так что, возможно, не дуп. - person phuclv   schedule 06.02.2018-frounding-math
. Clang для PowerPC компилирует ваш фрагмент без проблем. И если вы удалите _2_ тогда GCC также компилирует его должным образом и в C Режим и - person Jeremy Kerr   schedule 09.02.2018