2012年11月23日 星期五

float和int 的比較

 當初學者在接觸C時,常常會覺得float這麼好用,可以表示整數,也可以表示小數點,是不是以後都用float就好呀?事實上,不是的!因為float會一些表示上的限制,還有電腦在計算float上的會比int慢,所以如果沒有要表示小數點,就還是乖乖用int吧!以下的範例,是用來示範float在表示數字和運算上的一些數字,當我們學會loop後,我會在用loop示範float和int在運算速度上的差異!


CODE:
#includ
main (){
        int i;
        float f;
        i=67108863;//i=2^26-1
        f=67108863;//i=2^26-1
        printf("interger of 2^26-1: %d\n",i);
        printf("floating number of 2^26-1: %.1f\n\n",f);
        i=100000000-1;
        f=100000000-1;
        printf("interger of 100000000-1: %d\n",i);
        printf("floating number of 100000000-1: %.1f\n",f);
        }
OUTPUT:
            interger of 2^26-1: 67108863
            floating number of 2^26-1: 67108864.0

            interger of 100000000-1: 99999999
            floating number of 100000000-1: 100000000.0


以上的結果,可以得知當數字比較大的時候float會有誤差,起因是因為,float在電腦的世界裡是用科學記號表示,也是像100=1.0*10^2的這種方式表示(詳見wiki),而single float(也就是float,相較於double float)可以表示的數字為1後面小數點23位(這裡是指2進位時,也就是1.1111111…),超過時會用一種「類似」四捨五入的方式處理(實際是電腦會選擇進會或捨去,讓數字是一個偶數),所以當我們要表示的數字大於2^24方時,就產生上面第一個例子的問題,莫名其妙被進位了....
另外float在計算的時候,會把次方小的對齊次大的(也就是1.0*10^3+1.0*10^2會把1.0*10^2變成0.1*10^3)然後做相加,於是就造成了第二種範例的結果!

1 則留言:

  1. 你好,我想问一下int型数值可以和float型数值比较大小吗?

    回覆刪除