程式開發剖解聖經 008

2021-06-11 09:52:20 字數 3159 閱讀 1895

當我把整型資料講完的時候,差不多已經耗去了將近兩個小時的時間。這其實驗證了乙個道理:看似簡單的一些東西,如果究其細節的話,還是有很多東西可以挖掘的。但我必須有所克制,並有所重點的講給學生,我希望我能交給學生的是,他們既能理解這些內容,又能稍微深層的去解釋一些內容。

當整型資料講完的時候,我問學生是否聽懂了,學生說懂了。好,懂了,說明第三章的課我已經順利的完成了三分之一,接下來我開始講浮點型資料

浮點型資料不能過深的講解,那只會擾亂學生,使其對浮點型資料產生懼怕,以至於,後面不敢使用浮點型資料,但浮點型資料有時一門語言中不可缺少的語言,因此,思前想後,我先整體歸納為四句話:

1、              浮點型資料有單精度和雙精度,很明顯,雙精度所佔的位元組數是單精度所佔位元組數的一倍。

2、              浮點數表述資料型別,存在誤差。

3、              我們定義乙個浮點數的時候,編譯器是預設為雙精度的。

4、              浮點數的小數字數的。

歸納完這些,我看著學生認真的記下,頗為滿意。為了證明第一點,我引入了如下運算子,為了向學生著重強調,我寫了如下**。

int i =sizeof(int);

printf("%d\n",i);

寫完**我問學生:「列印出的內容是多少?」

「4」,確實有一部分學生知道。

「sizeof是幹什麼用的?」

「求資料型別大小的」

「sizeof是什麼?」

「函式。」

「什麼?再說一遍」

「函式。」

「喲~,你還真敢胡說呀。把書翻到第365頁,看一下附錄c,sizeof是什麼?」

「哦,運算子!」

「對,明白了吧!」

我想,學生以後不會再說sizeof是乙個函式了吧,於是我繼續寫**

int main(void)

寫完**,我會先讓學生說出每個值,當然,有說錯的,然後我給出執行結果。

其列印結果如下:

sizeof(unsigned int) = 4,sizeof(int)=4

,sizeof(char)=1,sizeof(float)=4

,sizeof(double)=8

press any key to continue

這樣,我就將明確了第乙個問題。顯然,用舉例子加提問的方法,是最能讓學生知道答案的。為了讓學生更好的理解浮點數是近似表示的,我繼續寫**如下:

double df = 5.13;

然後,我問學生:

「df的值是多少?」

「5.13」

「多少?」

「5.13」

「再說一遍,是多少?」學生開始在我的再三追問下,不敢說話了,

我於是執行程式,並把滑鼠移到了df上:5.1299999999999999。

「因此,我說實型資料是近似表示的,明白沒?至於為什麼,大家有興趣沒?」

「有」「很好,下去道網上搜尋一下浮點的具體儲存方法,我這裡不講!」

float df = 5.13;

「我繼續問,現在值是多少?」

很多學生不敢吭聲,知道一說就有問題。但也有學生說道:

「5.1299999999999999」

「我呸,我上面剛強調過,雙精度位元組數是單精度的位元組數的兩倍。」說完,我有接著說 「譚浩強那本書是不是沒帶?要麼就是一直合著沒開啟!」

學生匆忙翻開書翻到了第46頁,上面如是寫:float小數有效位數為6~~7位;

「現在大家說,是多少?」

「5.1299999」

「是麼?那你們仔細看是多少。」

「我再次執行程式,並把滑鼠設定在df上,結果為:5.130000」

「為啥?」

「為啥?問老師呢?能不能把你高貴的眼睛放到書上掃一下,把眼睛放到47頁,把開頭的一段話給我念一遍」

由於浮點型變數是由有限的儲存單元組成的,因此提供的又有效數字總是有限地,在有效位意外的數字將被捨去。

「明白了吧。」

「明白了。」

「那麼怎麼證明在定義以及使用乙個浮點數進行運算的時候,編譯器預設為雙精度的呢?」

還是上次的**,我重新換回double,然後編譯。生成的編譯結果如下:

--------------------configuration:cl_09 - win32 debug--------------------

compiling...

cl09.c

linking...

cl_09.exe - 0 error(s), 0 warning(s)

「有沒有告警?」

「沒有!」

「對,很明顯,沒有告警。」

「那你看這個有沒有告警?」我便說邊把double改為float,編譯結果如下:

--------------------configuration: cl_09 - win32debug--------------------

compiling...

cl09.c

e:\lesson\cl_09\cl09.c(4) : warning c4305: 'initializing': truncation from 'const double ' to 'float '

linking...

cl_09.exe - 0 error(s), 1 warning(s)

「有!」

「對,編譯器並不認為這是乙個錯誤,但會給出一條告警,告警內容說明,將double型別的資料轉換為float將會擷取一部分。」

「那麼如果我並不在乎這個告警,確實我們不需要在乎這個告警因為我們確實想要乙個float型別的資料,那該怎麼辦呢?」

很少有人回答,因為很多學生對老師的依賴很強,他們確實下去很少看書,看來,我的多布置一下作業,想辦法逼著學生往後看。我有些哀嘆之餘,書寫如下**,而這在書上有講:floatdf=5.12f;這樣我再編譯,告警消失了。

「看到沒,一旦我們確實需要這樣乙個內容,我們可以在後面新增乙個f;」

「哦」「同理,我們的整型資料也可以這樣做,至於怎麼新增,我不多說,大家看一下書,同樣,關於浮點數的計算,我並不講解,大家下去看書,還有,就是本次講課結束,大家開始做課後作業了,從第三章做到第六章做完,我下次課會先收作業。好,下課!」

《Go聖經》章二 程式結構

參考書 go程式語言 go學習路徑的go基礎模組,整理了一些我掌握不太好的地方 go語言中,名稱的作用域越大,名稱越長且越有意義。包級初始化在main函式開始前執行。number 0 bool false string 介面 引用型別 slice,指標,map,通道,函式 nil 短宣告 左面至少有...

《Linux命令列和Shell指令碼開發聖經》 致謝

首先,所有榮譽和讚揚歸之於上帝,是他借助聖子使一切變成可能,並給予我們永生的禮物。原文 first,all glory and praise go to god,who through his son makes all things possible,and gives us the gift o...

快速開發實用工具VRTK 008

展示了抓取之後再使用物件的功能,具體操作grippress按下抓取物體 vrtk interactgrab 然後triggerpress使用物體 射擊或旋轉 vrtk interactuse 即場景中極簡易的槍抓取後,再按扳機 首先在左右手柄上新增vrtk interactgrab和vrtk int...