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...