% F değişkenler yerine kayan nokta sabitleri iletildiğinde neden büyük değerler yazdırıyor?


9

Verilen programda neden her printfs için farklı sonuçlar elde ettim ?

#include <stdio.h>
int main()
{
    float c = 4.4e10;
    printf("%f\n", c);
    printf("%f\n", 4.4e10);
    return 0;
}

Ve aşağıdaki çıktıyı gösterir:

44000002048.000000
44000000000.000000

4
Şimdiye kadar verilen cevaplar , bunun başlatılmasında dönüştürülen ancak bir zaman olarak tutulan 4.4e10bir doublesabit olduğunu açıklamaktadır . Bununla birlikte, bir sonek eklemenin onu sabit hale getirdiğini de bilmek isteyebilirsiniz : Yazdırma işlemi, başlangıçtan sonucuna kadar olan değeri gösterir . Ayırt gelen sabitleri sabitleri kayan noktalı aritmetik ile kaliteli işi için önemli olabilir. floatcdoubleprintfffloat4.4e10fc4.4e10ffloatdouble
Eric Postpischil

Bu dönüşüm yöntemine herhangi bir ad verilir mi? Bunu okumak istiyorum.
user10056563

Eğer dönüşüm ne zaman bilmek ister misiniz doubleiçin floatC dilinde oluşur? Veya dönüşümden hangi değerlerin kaynaklandığını, yani dönüşümün ne gibi etkileri olduğunu bilmek ister misiniz? Veya başka bir şey?
Eric Postpischil

Ben sorguluyorum ne burada cevap ne de standart ama, ben küçükken ve öğrenme Ckullandığımız printf("%f",x)bir için floatve printf("%lf",x)bir için double. İşler ne zaman değişti? Ve nasıl açıkça (tek) float- printf printf("%hf",x)?
Adrian Mole

2
@ Printf %lfiçindeki adrian ile aynı şeydir %f. floatDeğişken bağımsız değişkenindeki A double, derleyici tarafından shorta'ya dönüştürülür , tıpkı bir int.
SS Anne

Yanıtlar:


9

A float, 32 bit kayan nokta sayısı içeren bir türken , sabit 4.4e10a double, 64 bit kayan nokta sayısı tutan (yani çift kesinlikli kayar nokta sayısı)

Atamak zaman 4.4e10için c, değer 4.4e10tam olarak ifade edilemez bir parametrede (yuvarlama hata mantissa) ve mümkün olan en yakın değeri (44000002048) depolanır. O geçirildiğinde printf, bu olup terfi geri doubleyuvarlama hatası dahil.

İkinci durumda, değer, doubledaralma ve genişleme olmaksızın bütün bir zamandır ve a'nın doubledeğeri tam olarak temsil edebileceği durumdur .

Bu istenmeyen bir davranışsa, biraz daha fazla hassasiyet için colarak ilan edebilirsiniz double(ancak sonuçta yine de hassasiyet sınırlarına ulaşacağınıza dikkat edin).


3

Aslında burada iki farklı türün değerini yazdırıyorsunuz.

İlk durumda, tür değişkenine bir değer atarsınız float. A'nın kesinliği floatyaklaşık 6 veya 7 ondalık basamaktır, bu nedenle değer tam olarak temsil edilemediği sürece bu türle temsil edilebilecek en yakın değeri görürsünüz.

İkinci durumda 4.4e10tip olan sabiti geçiyorsunuz double. Bu tür yaklaşık 16 ondalık basamak hassasiyetine sahiptir ve değer bu aralıktadır, bu nedenle tam değer yazdırılır.


Sonunda neden özellikle 2048 yazdırıyor?
user10056563

@ user10056563 Çünkü 4.4 bit'e en yakın sayı 32 bit şamandıra içinde saklanabilir.
dbush
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.