double_t в C99

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

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

#include <float.h> 

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

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

6
задан yCalleecharan 16 April 2010 в 18:10
поделиться

3 ответа

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

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

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

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

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

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

5
ответ дан 17 December 2019 в 02:26
поделиться

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

0
ответ дан 17 December 2019 в 02:26
поделиться

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

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

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

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

1
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: