bana neden ve nasıl bu sorunu gidermek için 1610612736C cinsinden tam sayılarla nasıl yüzeriz? Bu kodu çalıştırdığınızda
void main(){
float a=3.3f;
int b=2;
printf("%d",a*b);
}
döndürür?
düzenleme: şamandıra b ile aynı saçma bir sonuç
bana neden ve nasıl bu sorunu gidermek için 1610612736C cinsinden tam sayılarla nasıl yüzeriz? Bu kodu çalıştırdığınızda
void main(){
float a=3.3f;
int b=2;
printf("%d",a*b);
}
döndürür?
düzenleme: şamandıra b ile aynı saçma bir sonuç
bir float
ve çoğalması sonucu iade 2.0f = i int b = 2 yerine eğer, tamsayı ve kayan bile meselesi değil int
, float
'dur. Bunun yanı sıra, printf
'a geçerken double
'a yükseltilecektir. Bir %a
, %e
, %f
veya %g
biçimine ihtiyacınız vardır. %d
biçimi, int
türlerini yazdırmak için kullanılır.
Editörden Not: main
dönüş değeri int
olmalıdır. İşte sabit program:
#include <stdio.h>
int main(void)
{
float a = 3.3f;
int b = 2;
printf("%a\n", a * b);
printf("%e\n", a * b);
printf("%f\n", a * b);
printf("%g\n", a * b);
return 0;
}
ve çıkışı:
$ ./example
0x1.a66666p+2
6.600000e+00
6.600000
6.6
Wow, "% a", " printf rolünde işe yaramaz format belirteci "ödül :-) – paxdiablo
Harika!" IEEE754 kullanmayan sistemlerde bile (ikili) kayan nokta sayılarını% 100 doğru bir şekilde dizelerle aktarabilirsiniz. Tamamen kesin bir şekilde tüm hassas bitlerini korur. Kullanıcılar muhtemelen onu görmeyi umursamıyorlar, ancak .... –
harika çalışıyor! – Wicelo
Alternatif olarak, aynı zamanda
printf("%d\n", (int)(a*b));
yapabileceğini ve bu (tür) bekliyorsanız sonucu basacaktır .
Her zaman değişkenleri biçim dizgisiyle eşleşecek şekilde genel olarak yazmalısınız, aksi halde yazdırılan bazı tuhaf değerleri görebilirsiniz.
Bu bir tamsayı ve yüzer meselesi - cevabımı görün. –
@Carl haklı. Çoğaltma ile bir float/int problem olmayabilir ama _definitely_ biçim dizgesindedir. – paxdiablo
'printf' işlevi' int printf (const char * biçimi, ...) 'imzalı bir * varargs * yöntemidir. Bu, ilkinden sonra keyfi argümanlar alması ve bunları derleme zamanında kontrol edememesi veya * biçim dizgisinden * istenen bir türe dönüştürülmesi anlamına gelir. Biçim dizginiz 'int' için görünen'% d' diyor. 'A * b' ifadesi' double''a dönüştürülen 'float' ifadesidir. Bu tipler aynı bellek boyutuna sahip değildir, bu nedenle geçici 'çift' fiziksel olarak yarıya iner ve bir "int" olarak değerlendirilir. Bu bir Solomonî çözüm değildir. –