近似与精确——《狂人C》习题解答15(第三章习题5)
題目:從前有一個(gè)農(nóng)夫,死后留下15頭牛,他在遺書中寫到:"妻子:分給全部牛的半數(shù)再加半頭;長子:分給剩下的牛的半數(shù)再加半頭;次子:分給剩下的牛的半數(shù)再加半頭;長女:分給最后剩下的。"編程求長女得到了幾頭牛。
??? 這是一個(gè)簡單的小學(xué)算術(shù)問題:
??? 15頭牛的一半是7又1/2 ,再加半頭得8,這是妻子所得。剩下7頭
??? 7頭牛的一半是3又1/2 ,再加半頭得4,這是長子所得。剩下3頭
??? 3頭牛的一半是1又1/2 ,再加半頭得2,這是次子所得。剩下1頭
??? 因而長女所得為1頭。
??? 但是如果寫出如下的代碼,則最多只能得60分。
#include <stdio.h> #include <stdlib.h>#define ZONGSHU 15. //總數(shù):留下15頭牛 #define FENPEI_BL .5 //分配比例: 半數(shù) #define EWAI_TJ .5 //額外添加:半頭 int main( void ) {double qizi , zhangzi , cizi , zhangnv ; //妻子、長子、次子、長女所得 double shengyu = ZONGSHU ; //剩余的數(shù)量 qizi = shengyu * FENPEI_BL + EWAI_TJ ; //妻子所得shengyu -= qizi ; //剩余的數(shù)量zhangzi = shengyu * FENPEI_BL + EWAI_TJ ; //長子所得shengyu -= zhangzi ; //剩余的數(shù)量cizi = shengyu * FENPEI_BL + EWAI_TJ ; //次子所得shengyu -= cizi ; //剩余的數(shù)量zhangnv = shengyu ; //長女:分給最后剩下的printf("長女得到了%f頭牛\n" , zhangnv ) ;system("PAUSE"); return 0;}輸出:長女得到了1.000000頭牛
??? 因?yàn)?#xff0c;第一,這個(gè)結(jié)果僅僅表示長女得到的牛數(shù)約等于1頭;第二,代碼并沒有真正實(shí)現(xiàn)前面的算術(shù)運(yùn)算過程。譬如
??? qizi =? shengyu * FENPEI_BL +? EWAI_TJ ;
??? 所表示的含義僅僅是一些近似的值的一個(gè)近似運(yùn)算,而非前面算術(shù)運(yùn)算過程中的精確運(yùn)算。因?yàn)榫推浔举|(zhì)和普遍情形來講,實(shí)浮點(diǎn)類型的數(shù)據(jù)只是對實(shí)數(shù)的一個(gè)近似表示,這注定實(shí)浮點(diǎn)類型的運(yùn)算也只是一種近似運(yùn)算。只不過在本題目中,近似的精度很高,計(jì)算結(jié)果恰好和精確的結(jié)果一致而已。如果把程序視為對筆算過程的精確模擬的話,顯然前面一段代碼并不符合要求。
??? 在計(jì)算機(jī)中,只有整數(shù)類型是對整數(shù)集合子集的近似表示。所以如果希望準(zhǔn)確地模擬筆算過程就只能用整數(shù)類型。然而筆算過程涉及到了分?jǐn)?shù)。在數(shù)學(xué)中,分?jǐn)?shù)也是一種精確表示,然而在C語言中卻并沒有與之對應(yīng)的“分?jǐn)?shù)類型”。
??? 沒有相應(yīng)的數(shù)據(jù)類型怎么辦?答案很簡單:沒有這種類型就創(chuàng)造這種數(shù)據(jù)類型。為創(chuàng)造性提供了廣闊的發(fā)揮空間是C語言的特點(diǎn)和魅力,也恰恰是編程的樂趣之一。
??? 由于分?jǐn)?shù)是由分子、分母兩個(gè)部分組成,而分子、分母都是整數(shù),因而可以用兩個(gè)整數(shù)類型的數(shù)據(jù)來表示分?jǐn)?shù)。對于這樣的數(shù)據(jù),C語言并沒有提供直接的運(yùn)算,這種“分?jǐn)?shù)”的運(yùn)算需要自己用C語言所提供的運(yùn)算模擬。
??? 例如,若計(jì)算a/b+c/d,則無法通過一次“+”運(yùn)算完成,只能分兩次計(jì)算出和的分子“b*c+d*c”及和的分母“a*c”。
??? 按照這種辦法得到的代碼是
輸出:長女得到了1又0/16384頭牛
??? 這是一個(gè)精確的結(jié)果。
??? 【注:學(xué)習(xí)了控制語句和函數(shù)理論之后,后一個(gè)代碼可以進(jìn)一步改進(jìn)。】
?
轉(zhuǎn)載于:https://www.cnblogs.com/KBTiller/archive/2011/09/24/2189685.html
總結(jié)
以上是生活随笔為你收集整理的近似与精确——《狂人C》习题解答15(第三章习题5)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chrome开发者工具和Firebug的
- 下一篇: hdu_1233(最小生成树)