C語言關於分數的浮點數值的計算,怎樣用c語言寫一個將小數轉化成最簡分數的演算法

2021-03-04 05:26:26 字數 1833 閱讀 9396

1樓:匿名使用者

#include

int main()

怎樣用c語言寫一個將小數轉化成最簡分數的演算法

2樓:止語

演算法很簡單,程式中已經說明。重要的是系統對浮點數是有修正的,導致結果出現問題。

如何解決,詳見程式。

//#include "stdafx.h" //vs 預設使用

#include

#include

#include

#pragma warning(disable: 4996)

//為了最大限度支援(目前)小數,整數定義成:__int64

//支援32位:以下分別為 int(__int32) 1e8

#define zhengshu __int64

#define xiaoshudianzuoyi 1e15 //double 最多隻能確精確到15位有效數字

#define xiuzheng 1e-16 //用於修正浮點數計算誤差

int _tmain(int argc, _tchar* argv)

else

zs = (zhengshu)xs; //支援假分數

//計算整數部分的有效數位數

k = 1;

while (zs / k > 0)

k *= 10;

xs -= (double)zs;

fm = xiaoshudianzuoyi / k; //分母

xs = (double)((zhengshu)((xs + xiuzheng * k) * fm)) / fm; //修正浮點數計算誤差

xs += xiuzheng; //修正浮點數計算誤差

fz = (zhengshu)(xs * fm); //分子

for (;;) //這樣迴圈,是因為 c/c++ 中,for 迴圈效率最高

else

}//實現第二步:約分。以下看起來有點麻煩,目的是為了減少演算法的時間複雜的

while ((fz % 2 == 0) && (fm % 2 == 0))

k = 3;

for (;;)

k += 2;

if (k > (zhengshu)sqrt(fz))

break;

}//將整數部分加上,形成假分數。如果原數為不為0整數,則化成分母為 1 的假分數

//如果原數為 0,則化成分子為 0,分母為 1。

if (fz == 0)

else

//結束

//顯示一下結果

printf("%lf = %lld/%lld\n", fh * (zs + xs), fz, fm);

//printf("%lf = %ld/%ld\n", fh * (zs + xs), fz, fm); //32位

system("pause"); //防止視窗一閃而退

return 0;}

3樓:

沒有精確的轉換方法,只能模糊轉,你要多模糊呢,分子在什麼範圍內?

c語言雙精度浮點型取值怎麼算出來的?

4樓:匿名使用者

不知道你**不懂bai

-1.79769313486232e308相當於-1.79769313486232*10^du308

4.94065645841247e-324相當於4.94065645841247/(10^324)

是這zhi裡不明白麼?

至於取值怎dao麼算出來的其實不用深專究 這裡的屬儲存方式和int、char之類的是不一樣的

浮點數的表示範圍,浮點數所能表示的數值範圍和精度取決於什麼

最常用的32位規格化浮點數的表示範圍是 前提條件 階碼用移碼錶示,尾數用補碼錶示,每1位是符號位,階碼佔8位,尾數佔23位 可表示的最大正數 1 2 23 2 127最小正數 2 129 最大負數 2 129 最小負數 2 127 呵呵,不同的編譯環境下,浮點數的範圍是不同的 目前多數系統都按照ie...

c語言中怎樣判斷輸入的是整數還是浮點數

先存成字串,判斷有沒有小數點,再從字串格式化成整型或浮點型。include include include char strchr const char str,int ch int main int argc,char argv else system pause return 0 scanf s...

C語言 呼叫自定義交換函式,完成浮點數從小到大排列

正如樓上所說,這個方法是很多的。我舉一個例子 include void swap double x,double y 定義交換函式 main for i 0 i 3 i 氣泡排序for j 0 j 3 i j if st j st j 1 swap st j st j 1 for i 0 i 5 i...