2016-04-27 14 views
19

değil zemin tüm çiftler int türüne kapsamaz: Neden C kodu Verilen C

#include <math.h> 
#include <stdio.h> 
int main(){ 
int i; 
double f=log(2.0)/log(pow(2.0,1.0/2.0)); 
printf("double=%f\n",f); 
printf("int=%d\n",(int) f); 
} 

Ben çıktı alın:

double=2.000000 
int=1 

f görünüşte en az 2.0 olduğunu. Neden dökme değeri 2 değil mi?

+11

olduğunu soru cevaplardan, yanlıştır. gerçek "sorun" Printf kayan nokta sayıları yuvarlar olmasıdır. – user35702

+0

Ayrıca, int'nin aynı boyuta sahip olduğu ve log ((double) int_64_variable) 'gibi bir şey yaptığınız bir durumu da düşünebilirsiniz. Bunun için bir c programı yazmaktan daha bir kağıt parçası üzerine bunu daha eğilimli duyuyorum. ;) – sjsam

+1

Ayrıca, "int" işlevinin * yapılmadığını, ancak sıfıra doğru kaydığını unutmayın. Bu olumsuz değerler için önemlidir. – jamesdlin

cevap

34

ikizi değeri az 2

double=1.99999999999999978 
int=1 

Deneyin ama bu sefer cehennem gibi

#include <math.h> 
#include <stdio.h> 
int main(){ 
int i; 
double f=log(2.0)/log(pow(2.0,1.0/2.0)); 
printf("double=%0.17f\n",f); 
printf("int=%d\n",(int) f); 
} 

Kafa karıştırıcı bazı hassasiyetli bu deneyim ilk kez eklemek için. Şimdi, bu

Bu değeri doğru şekilde yuvarlarsanız. Eğer adam sayfasında bakacak olursak, (a mac üzerinde en az) onlar yönüne göre demek istiyorsun ...

round, lround, llround -- round to integral value, regardless of rounding direction 

şu yorumu göreceksiniz, hepsi IEEE 754 belirtilen oluyor. Eğer kontrol ederseniz different ways to round to an integer... kat 1 :) doğru

7

Tamsayı bir yuvarlanır değeri almaz oldu bu durumda ama kesilmeyi yapar -ve infinity doğru yuvarlama olarak zikredilir. Yani, f, 1.999999999999 [..] 9'a eşitse, int değeri 1 olacaktır.

Ayrıca, çiftin daha doğru olması istenirse, karakter sayısı dikkate alınarak yuvarlanmış bir değer alır. o 2.000000 olan gösterebiliriz.

7

Kayan nokta türleri tam olarak bazı sayıları temsil etmek mümkün değildir. Matematiksel olarak, IEEE754 kayan noktalara sahip calculation should be exactly 2, sonuç 2'den biraz daha az ortaya çıkıyor. Daha fazla bilgi için bkz. this question.

%f yerine %.20f belirtmek suretiyle çıktınızın kesinliğini artırırsanız, sayının tam olarak 2 olmadığını ve daha az doğrulukla yazdırırken sonucun basitçe yuvarlak olduğunu görürsünüz.

ancak bir int dönüştüren, kayan nokta tipi tam doğruluk kullanılır ve sadece 2 yaşın altındaki gelir, çünkü bir tam sayıya dönüştüren sonuç O öncül gibi görünüyor 1.