C語言 int,float,double整型和浮點型資料在相互運算時bug原因
先看一段程式碼:
#include <stdio.h>
int main ()
{
double a;
int b,c;
b = 5,c=6;
a = b/c;
printf("%f\n",a);
return 0;
}
>>>
0.000000
Press any key to continue
按理來說,a應該等於0.833333。但是結果a等於零。
這是因為,程式先整數計算b/c,此時的輸出實際上是被截去了小數部分,再轉化為float的數。故應該把bc定義為浮點型別。
再看一個例子:
#include <stdio.h>
#include <math.h>
int main()
{
int i=1,d=1,t;
double pi=0.0;
for (;;d++,i+=2)
{
if (d % 2 == 0) t = -i;
//第偶數個式子是負數
else (t = i);
if (fabs(1/t) < (1e-6)) break;
//fabs(x),對雙精度x求絕對值,得到結果是雙精度型
pi = pi + (1/ t);
}
pi = pi*4;
printf("pi = %f\n",pi);
return 0;
}
>>>
pi=4.00000
Press any key to continue
這是一個求π的小程式。其演算法是:
為什麼得到的結果是pi = 4.00000呢?
原因和第一個例子一樣,由於我們定義t為整型,而fabs和pi都是雙精度型,故在計算 1 / t 時,程式先整數計算1 / t ,取整數部分,再對其轉換為雙精度型。因此,迴圈體只執行一次,在 t = -3 時,fabs() = 0,執行break,退出迴圈。
為使得程式正常執行,我們應該把t定義為雙精度型。
#include <stdio.h>
#include <math.h>
int main()
{
int i=1,d=1;
double pi=0.0,t;
for (;;d++,i+=2)
{
if (d % 2 == 0) t = -i;
else (t = i);
if (fabs(1/t) < (1e-6)) break;
pi = pi + (1/ t);
}
pi = pi*4;
printf("pi = %f\n",pi);
return 0;
}
>>>
pi = 3.141591
Press any key to continue
相關文章
- c語言中int與float資料運算時,資料轉換問題C語言
- C語言資料型別和算數運算C語言資料型別
- c語言中%f輸出double型和float型值C語言
- (C語言) int型之間除法運算,向零取整C語言
- [C語言] 浮點型儲存C語言
- 【PL/SQL】IEEE浮點型別BINARY_FLOAT和BINARY_DOUBLESQL型別
- C/C++_int/float/double的最大值和最小值C++
- c語言字串與整形,浮點數...相互轉換C語言字串
- c++ 基本資料型別(int、float、double、long、long long)最大值,最小是表示方法C++資料型別
- c中int型和浮點型的格式話輸出
- C/C++——求下面資料型別的最大值和最小值: char, short, int, long, float, double, long double和numeric_limits使用C++資料型別MIT
- Python做浮點數(float)運算要小心Python
- object-c中NSString與int和float的相互轉換Object
- FLOAT:浮點數值資料的大致數值資料型別資料型別
- c++ float 計算時注意點C++
- C語言基礎-1、邏輯型別和運算C語言型別
- Java浮點數float,bigdecimal和double精確計算的精度誤差問題總結JavaDecimal
- int/double資料範圍
- C# float浮點數與二進位制相互轉換(IEEE754)C#
- C語言位運算C語言
- 準確詳解:C/C++ float、double資料型別的表示範圍及精度C++資料型別
- C語言---整型字串轉換C語言字串
- C語言資料型別C語言資料型別
- int型別和long long型別運算執行時間的差別型別
- C#語法浮點型字面量C#
- sql server資料庫如何儲存陣列,int[]float[]double[]陣列儲存到資料庫方法SQLServer資料庫陣列
- 【C語言】整型在記憶體中的儲存C語言記憶體
- C語言中關於float、double、long double精度及數值範圍理解C語言
- int float double 各型別的最大值最小值型別
- c語言字元常量當做整型C語言字元
- 【轉】JS浮點數運算Bug的解決辦法JS
- C語言(基本資料型別)C語言資料型別
- java double、float型別的比較Java型別
- 取冪運算--C語言描述C語言
- 關於MYSQL中FLOAT和DOUBLE型別的儲存MySql型別
- go語言與c語言的相互呼叫GoC語言
- 計組之資料運算:9、浮點數的表示
- arange浮點型別資料型別