Реализация Pow для двойного
Я разрабатываю код, который будет использоваться для управления движением, и у меня возникла проблема с функцией pow. Я использую VS2010 в качестве IDE.
Вот моя проблема: Я имею:
double p = 100.0000;
double d = 1000.0000;
t1 = pow((p/(8.0000*d),1.00/4.000);
Оценивая эту последнюю функцию, я не получаю лучшего приближения в качестве результата. Я получаю правильные 7 десятичных цифр, и все последующие цифры являются мусором. Я предполагаю, что функция pow только приводит к вводу любой входной переменной как float и процедур с вычислением.
Am I right? If so, is there any code I can get "inspired" with to reimplement pow for a better precision?Редактировать: Решено.
В конце концов, у меня были проблемы с битами конфигурации FPU, вызванные Direct3D, который использовался OGRE 3D Framework.
Если вы используете OGRE, в графическом интерфейсе конфигурации просто установите «Режим с плавающей запятой = Согласованный».
При использовании необработанного Direct3D при вызове CreateDevice обязательно передайте & quot; D3DCREATE_FPU_PRESERVE & quot; флаг к нему.
Исходное сообщение:
You may be using a libray that is changing the default precision of the FPU to single-precision. Then all floating-point operations, even on doubles, will actually be performed as single-precision operations.
As a test, you can try calling _controlfp( _CW_DEFAULT, 0xfffff ); (you need to include ) before performing the calculation to see if you get the correct result. This will reset the floating-point control word to default values. Note that it will reset other settings as well, which may cause issues.
One common library that changes the floating-point precision is Direct3D 9 (and maybe other versions too): By default, it changes the FPU to single-precision when creating a device. If you use it, specify the flag D3DCREATE_FPU_PRESERVE when creating the device to prevent it from changing the FPU precision.