Какова точность long double в С++?

Кто-нибудь знает, как узнать точность long double на конкретной платформе? Кажется, я теряю точность после 17 десятичных цифр, что совпадает с тем, когда я просто использую double. Я ожидал бы получить больше, так как double представлен 8 байтами на моей платформе, а long double — 12 байтами.

Прежде чем вы спросите, это для Project Euler, так что да, мне действительно нужно больше 17 цифр. :)

EDIT: Спасибо за быстрые ответы. Я только что подтвердил, что могу получить только 18 десятичных цифр, используя long double в своей системе.


person Bill the Lizard    schedule 24.01.2009    source источник
comment
Возможно ли, что в какой-то момент он преобразует вещи в обычные двойные?   -  person Paul Tomblin    schedule 24.01.2009
comment
Да, это определенно возможно. Я не спал до 2 часов ночи, проверяя свой код прошлой ночью, и я почти уверен, что он все время удваивался.   -  person Bill the Lizard    schedule 24.01.2009


Ответы (2)


Вы можете узнать с помощью std::numeric_limits:

#include <iostream>     // std::cout
#include <limits>       // std::numeric_limits
int main(){
    std::cout << std::numeric_limits<long double>::digits10 << std::endl;
}
person Johannes Schaub - litb    schedule 24.01.2009
comment
скажет ли это вам о точности или просто о пределах? - person Paul Tomblin; 24.01.2009
comment
это говорит вам точность. то есть сколько цифр вы можете иметь в двойном. min() и max() сообщают вам предел - person Johannes Schaub - litb; 24.01.2009
comment
В частности, он расскажет вам, сколько вы можете округлить до длинного двойного числа и не потерять цифру. - person user7116; 24.01.2009
comment
да, в то время как min() и max() сообщат вам предел, который вы можете иметь, даже если вы потеряете точность. max здесь 1.18973e+4932, а digits10 — 18. - person Johannes Schaub - litb; 24.01.2009
comment
Спасибо за ответ. Я получаю те же результаты, 18 десятичных цифр. Теперь мне интересно, зачем нужны 4 дополнительных байта памяти, чтобы получить еще одну десятичную цифру? - person Bill the Lizard; 24.01.2009
comment
На x86 это, как правило, 80-битный расширенный формат: 64 бита мантиссы, 15 бит экспоненты, вероятно, будет около 18 круглых безопасных цифр. Double — это 53-битная мантисса или 16 круглых безопасных цифр. - person user7116; 24.01.2009

Вы можете использовать ‹cfloat›. Конкретно:

LDBL_DIG
person user7116    schedule 24.01.2009
comment
Спасибо за ссылку. Это LDBL_DIG, который дает десятичные цифры. LDBL_MANT_DIG дал мне двоичные цифры. - person Bill the Lizard; 24.01.2009