Я просто считал, что C99 имеет double_t, который должен быть, по крайней мере, столь же широким как дважды. Это подразумевает, что дает больше цифр точности после десятичного разряда? Больше, чем обычные 15 цифр для дважды?.
Во-вторых, как использовать его: только включает
#include <float.h>
достаточно? Я считал, что нужно установить FLT_EVAL_METHOD на 2 долгое время дважды. Как сделать это? Поскольку я работаю с численными методами, я хотел бы максимальную точность, не пользуясь библиотекой произвольной точности.
Большое спасибо...
double_t
имеет как минимум такую же ширину , как double; т.е. это может быть то же самое, что и double. Сноска 190 в стандарте C99 поясняет цель:
Типы float_t и double_t предназначены быть наиболее эффективными типами реализации, по крайней мере, такими же широкими , как float и двойной соответственно.
Как заметил Майкл Берр, вы не можете установить FLT_EVAL_METHOD
.
Если вам нужен самый широкий тип с плавающей запятой в любой доступной системе, использующей только C99, используйте long double
. Просто имейте в виду, что на некоторых платформах он будет таким же, как double
(и даже может быть таким же, как float
).
Кроме того, если вы «работаете с численными методами», вы должны знать, что для многих (наиболее четких) численных методов ошибка аппроксимации метода значительно больше, чем ошибка округления двойной точности, поэтому часто нет никакой пользы. к использованию более широких типов. Конечно, есть исключения. Над каким типом численных методов вы конкретно работаете?
Edit: серьезно, либо (а) просто используйте long double
и назовите этот день, либо (б) потребуется несколько недель, чтобы узнайте, как на самом деле реализована плавающая точка на платформах, на которые вы ориентируетесь, и каковы фактические требования к точности для алгоритмов, которые вы реализуете.
double_t
может быть определено с помощью typedef double double_t;
- конечно, если вы планируете полагаться на особенности реализации, вам нужно посмотреть на свой собственная реализация.
Обратите внимание, что вы не можете установить FLT_EVAL_METHOD
- он устанавливается заголовками компилятора, чтобы позволить вы определяете, как библиотека делает определенные вещи с плавающей запятой.
Если ваш код очень чувствителен к тому, как именно выполняются операции с плавающей запятой, вы можете использовать значение этого макроса для условной компиляции кода для обработки тех различий, которые могут быть важны для вас.
Так, например, в целом вы знаете, что double_t
будет как минимум double
во всех случаях. Если вы хотите, чтобы ваш код делал что-то другое, если double_t
является long double
, то ваш код может проверить, FLT_EVAL_METHOD == 2
, и действовать соответственно.
Обратите внимание, что если FLT_EVAL_METHOD
имеет значение, отличное от 0, 1 или 2, вам нужно посмотреть документацию компилятора, чтобы точно узнать, что такое тип double_t
.