2015-06-24 21 views
1

В ЦОС в XC16 компилятора подпрограммы заголовка (dsp.h) есть такие строки:Microchip XC16 dsp.h определяет неправильное значение PI?

/* Some constants. */ 
#ifndef PI        /* [ */ 
#define PI 3.1415926535897931159979634685441851615905761718750 /* double */ 
#endif /* ] */ 
#ifndef SIN_PI_Q        /* [ */ 
#define SIN_PI_Q 0.7071067811865474617150084668537601828575134277343750 
               /* sin(PI/4), (double) */ 
#endif /* ] */ 

Но, значение PI является на самом деле (в том же количестве знаков после запятой) составляет:

3.1415926535897932384626433832795028841971693993751 

Значения, определяемые dsp.h, начинают расходиться в 16-м знаке после запятой. Для операций с двойной плавающей запятой это очень важно. Для представлений Q15 это не имеет значения. Значение sin (pi/4) также отклоняется от правильного значения в 16-м знаке после запятой.

Почему Microchip использует неправильное значение? Есть ли какая-то эзотерическая причина, связанная с вычислением значений функции триггера, или это просто ошибка? Или, может быть, это не имеет значения?

+1

nasa, по-видимому, использует 16 цифр для pi для управления космическим кораблем, и поскольку они (обычно) не пропустят свои цели, я бы не стал беспокоиться ... –

ответ

0

Иногда такие значения настраиваются для округления до номера машины. 17 (в том числе до запятой) значимые места - это то, где двойное значение становится неточным (и операции в компиляторе для вычисления значения с ограниченной точностью могут даже ухудшить его)

Таким образом, библиотечные программисты могли бы манипулировать значением, чтобы обеспечить округление до «действительно» из десятичного представления в источнике до ближайшего двоичного числа.

Тест должен состоять в том, чтобы записать номер в двоичном формате, и, вероятно, после первых 52 цифр оставшиеся цифры будут равны нулю.

IOW это лучшее двоичное представление десятичного числа pi 16-19 цифр, преобразованного обратно в десятичное число, которое может давать дополнительные цифры.

1

Оказывается, что оба:

3.1415926535897931159979634685441851615905761718750 

и

3.1415926535897932384626433832795028841971693993751 

при преобразовании в два раза (64bit поплавок) представлены одним и тем же двоичным числом:

3.14159265358979311599796346854 
(0x400921FB54442D18) 

Так это не имеет никакого значения в этом случае.

Что касается того, почему они используют другое число? Не все алгоритмы, генерирующие PI, порождают цифровую цифру. Некоторые из них производят ряд чисел, которые просто сходятся к pi, а не производят по одной цифре за раз. Хорошим примером этого являются дробные значения PI. 22/7, 179/57, 245/78, 355/113 и т. Д. Все ближе и ближе к PI, но они не делают это по цифрам. Аналогично, метод приближения многоугольника, который популярен, потому что он может быть легко рассчитан компьютерными программами, может вычислять последовательные числа, которые становятся все ближе и ближе к PI, но не делают это цифрами.

+0

Обратите внимание, что 3.14159265358979311599796346854 является абсолютным ближайшим вы можете добраться до PI в 64-битный формат IEEE с плавающей запятой. Если вам нужно лучшее приближение, тогда вам нужно использовать 128-битный float (ну, вы можете придумать 96-битный float, но я не уверен, что это стандарт) – slebetman

+0

Если оба значения производят одинаковое кодирование IEEE, почему бы не использовать правильное значение? Это не так, как если бы Microchip должен был пойти и вычислить значение - значение pi хорошо документировано :) – EBlake

+0

@EBlake: Дело в том, что оба являются «правильными» значениями.Это просто одно правильно в цифровом виде, а другое верно в том смысле, что оно приближается к ПИ в его приближении. – slebetman