O código
float x = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);
lhe dará a saída
x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116
onde na terceira linha de saída 741012573242
é lixo e na quarta linha 116
é lixo. Os duplos sempre têm 16 números significativos, enquanto os carros alegóricos sempre têm 7 números significativos? Por que as duplas não têm 14 números significativos?
fonte
__STDC_IEC_559__
. Uma implementação que não define essa macro é livre para não estar em conformidade com a IEEE-754.0.5
,0.046875
ou0.376739501953125
contra suas representações decimais. (Todos esses são racionais diádicos com ajuste de numerador na mantissa e logaritmo de base 2 do ajuste de denominador no expoente.)Não. As duplas sempre têm 53 bits significativos e os flutuadores sempre têm 24 bits significativos (exceto para valores anormais, infinitos e NaN, mas esses são assuntos para uma pergunta diferente). Esses são formatos binários, e você só pode falar claramente sobre a precisão de suas representações em termos de dígitos binários (bits).
Isso é análogo à questão de quantos dígitos podem ser armazenados em um número inteiro binário: um número inteiro de 32 bits não assinado pode armazenar números inteiros com até 32 bits, o que não é mapeado com precisão para qualquer número de dígitos decimais: todos os números inteiros de até É possível armazenar 9 dígitos decimais, mas muitos números de 10 dígitos também podem ser armazenados.
A codificação de um duplo usa 64 bits (1 bit para o sinal, 11 bits para o expoente, 52 bits significativos explícitos e um bit implícito), que é o dobro do número de bits usados para representar um float (32 bits).
fonte
float: 23 bits de significando, 8 bits de expoente e 1 bit de sinal.
double: 52 bits de significando, 11 bits de expoente e 1 bit de sinal.
fonte
Geralmente, ele é baseado em números significativos do expoente e do significando na base 2, e não na 10. Com base no que posso dizer no padrão C99, no entanto, não há precisão especificada para flutuadores e duplos (além do fato de que 1 e
1 + 1E-5
/1 + 1E-7
são distinguíveis [float
edouble
repsectivamente]). No entanto, o número de números significativos é deixado para o implementador (bem como qual base eles usam internamente, portanto, em outras palavras, uma implementação pode decidir fazê-lo com base em 18 dígitos de precisão na base 3). [1]Se você precisar conhecer esses valores, as constantes
FLT_RADIX
eFLT_MANT_DIG
(eDBL_MANT_DIG
/LDBL_MANT_DIG
) são definidas em float.h.O motivo pelo qual é chamado a
double
é porque o número de bytes usados para armazená-lo é o dobro do número de um float (mas isso inclui o expoente e o significando). O padrão IEEE 754 (usado pela maioria dos compiladores) aloca relativamente mais bits para o significando do que para o expoente (23 a 9 parafloat
vs. 52 a 12 paradouble
), e é por isso que a precisão é mais do que duplicada.1: Seção 5.2.4.2.2 ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )
fonte
1E-9
paradouble
, não1E-7
.Um flutuador possui 23 bits de precisão e um duplo possui 52.
fonte
Não é exatamente precisão dupla por causa de como o IEEE 754 funciona, e porque o binário não é realmente traduzido corretamente para decimal. Dê uma olhada no padrão, se você estiver interessado.
fonte
float significa número de ponto flutuante. Em C, o tipo de dado float é usado nos casos em que a precisão do número total de dígitos é 7. Por exemplo: - o número decimal. 12.3546987 não pode ser armazenado no float porque possui um total de 9 dígitos. A saída será mostrada como 12.354699, ou seja, os primeiros 7 dígitos serão mostrados conforme digitados na entrada e o oitavo dígito será arredondado. O tipo de flutuador pode representar valores variando de aproximadamente 1,5 x 10 ^ (- 45) a 3,4 x 10 ^ (38). Em termos de alocação de memória, float é um tipo de dados de ponto flutuante de precisão única e 32 bits.
Ao contrário do float, o double tem uma precisão de 15 a 16 dígitos.O intervalo de double é de 5,0 × 10 ^ (- 345) a 1,7 × 10 ^ (308). Em termos de alocação de bytes, double é um dado de ponto flutuante de 64 bits tipo.
O problema surge no seu uso. Float ou double não afeta printf, mas no caso de scanf, o tipo de dados apropriado deve ser usado, dependendo do número total. de dígitos no número flutuante. isso deve ser lido da entrada.
Portanto, o dobro é preferido sobre o float para maior precisão dos dados.
Espero que isto ajude.
fonte