double_t в C99 - PullRequest
       51

double_t в C99

6 голосов
/ 16 апреля 2010

Я только что прочитал, что у C99 есть double_t, который должен быть как минимум такой же ширины, как double. Означает ли это, что он дает более точные цифры после запятой? Больше чем обычные 15 цифр на двоих?

Во-вторых, как его использовать: включает только

#include <float.h> 

достаточно? Я прочитал, что нужно установить FLT_EVAL_METHOD в 2 для длинных двойных. Как это сделать? Поскольку я работаю с численными методами, я хотел бы добиться максимальной точности без использования библиотеки произвольной точности.

Большое спасибо ...

Ответы [ 3 ]

5 голосов
/ 16 апреля 2010

Нет. double_t равно как минимум в ширину как двойная; то есть это может быть то же самое, что и double. Сноска 190 в стандарте C99 проясняет намерение:

Типы float_t и double_t: предназначен для реализации наиболее эффективные типы, по крайней мере, такие же широкие как float и double соответственно.

Как заметил Майкл Барр, вы не можете установить FLT_EVAL_METHOD.

Если вам нужен самый широкий тип с плавающей запятой в любой системе, доступной только на C99, используйте long double. Просто помните, что на некоторых платформах это будет то же самое, что и double (и даже может быть таким же, как float).

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

Редактировать: серьезно, либо (а) просто используйте long double и назовите его день, либо (б) потратьте несколько недель, чтобы узнать о том, как на самом деле реализована плавающая точка на платформах, которые вы Вы нацеливаетесь, и каковы фактические требования к точности для алгоритмов, которые вы реализуете.

1 голос
/ 16 апреля 2010

Обратите внимание, что вы не можете установить FLT_EVAL_METHOD - он устанавливается заголовками компилятора, чтобы позволить вам определить, как библиотека делает определенные вещи с плавающей запятой.

Если ваш код очень чувствителен к точности выполнения операций с плавающей запятой, вы можете использовать значение этого макроса для условной компиляции кода для обработки тех различий, которые могут быть важны для вас.

Так, например, в общем, вы знаете, что double_t будет по крайней мере double во всех случаях. Если вы хотите, чтобы ваш код делал что-то другое, если double_t является long double, тогда ваш код может проверить, если FLT_EVAL_METHOD == 2, и действовать соответственно.

Обратите внимание, что если FLT_EVAL_METHOD является чем-то отличным от 0, 1 или 2, вам нужно взглянуть на документацию компилятора, чтобы точно знать, какой тип double_t.

0 голосов
/ 16 апреля 2010

double_t может быть определено как typedef double double_t; - конечно, если вы планируете полагаться на особенности реализации, вам нужно взглянуть на собственную реализацию.

...