網域名稱俱樂部


返回   網域名稱俱樂部 > 電腦與網路技術 > 電腦網路相關技術 > 一般軟體與網路使用討論

回覆
 
主題工具
  #1  
舊 2015-05-21, 04:17 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,059
預設 c語言數值資料大小的問題

請問一下先進,既然 unsigned long 和 float 都是用占用 4 byte 的長度,為何二者能表示的數值差那麼多?
unsigned long 只能表示到 4294967295,float 則可以表達到 +-3.4e38,亦即是正負339999995214436424907732413799364296704.000000 ?
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #2  
舊 2015-05-21, 05:26 PM
Ricado 的頭像
Ricado Ricado 目前離線
進階會員
 
註冊日期: 2004-07-13
住址: 蕃薯島,打狗城
文章: 4,456
預設

簡單的回答
整數是直接儲存數值
浮點是儲存表示式,而不是實際的數值
浮點表示的是近似值
回覆時引用此篇文章
  #3  
舊 2015-05-21, 05:59 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,059
預設

引用:
作者: Ricado 查看文章
簡單的回答
整數是直接儲存數值
浮點是儲存表示式,而不是實際的數值
浮點表示的是近似值
感謝,大致了解,但不太懂浮點數實際儲存的樣子是如何? 它的10101的儲存表達的是類似 2.1e5這樣而非210000這樣嗎?
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #4  
舊 2015-05-21, 06:52 PM
Ricado 的頭像
Ricado Ricado 目前離線
進階會員
 
註冊日期: 2004-07-13
住址: 蕃薯島,打狗城
文章: 4,456
預設

引用:
作者: 哈啦 查看文章
感謝,大致了解,但不太懂浮點數實際儲存的樣子是如何? 它的10101的儲存表達的是類似 2.1e5這樣而非210000這樣嗎?
32 位元
1bit 正負號
8bit 指數(次方)
23bit 尾數(小數點後面的數字)

64位元
1bit 正負號
11bit 指數(次方)
52bit 尾數(小數點後面的數字)

因為浮點是使用表示式儲存,所以計算方式也不同。浮點運算能力就是評定 CPU 運算能力很重要的一環。

很久很久以前為了報恩,曾利用浮點運算幹了些換式。
沒錢的時候某特定廠商提供免費的機器,所以後來申請到預算後,為了讓這家廠商得標,就採用技術標,誰的運算能力強就買誰的。這家的乘法運算比除法強,所以全面改寫程式碼,例如除以2,全部改寫成 乘以0.5
回覆時引用此篇文章
  #5  
舊 2015-05-21, 07:16 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,059
預設

引用:
作者: Ricado 查看文章
32 位元
1bit 正負號
8bit 指數(次方)
23bit 尾數(小數點後面的數字)

64位元
1bit 正負號
11bit 指數(次方)
52bit 尾數(小數點後面的數字)

因為浮點是使用表示式儲存,所以計算方式也不同。浮點運算能力就是評定 CPU 運算能力很重要的一環。

很久很久以前為了報恩,曾利用浮點運算幹了些換式。
沒錢的時候某特定廠商提供免費的機器,所以後來申請到預算後,為了讓這家廠商得標,就採用技術標,誰的運算能力強就買誰的。這家的乘法運算比除法強,所以全面改寫程式碼,例如除以2,全部改寫成 乘以0.5
十分感謝,以後還會常常麻煩您指導。
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #6  
舊 2015-05-22, 06:24 AM
yumi yumi 目前離線
進階會員
 
註冊日期: 2005-12-29
文章: 1,373
預設

unsigned long4字节 数字是精确的 例如 long a=1123310766
float4字节 仅仅精确7位数字 float b=1.23456789 理论上 前7位数字是准确的 实际上 可能只能精确5-6位

# include "stdio.h"
main(){
float b[4];
b[0]=4.0;
b[1]=4.1;
b[2]=4.2;
b[3]=4.3;
for(int i=0;i<4;i++)
if (b[i]>=4.1) printf("%f ",b[i]);
}

这是float常见的笑话,它的数值实际是不精确的。
__________________
收购各位版友的四字母com、数字米com/net/cc、三杂米com、拼音米。价格随行市价。站内联系。

此篇文章於 2015-05-22 06:44 AM 被 yumi 編輯。
回覆時引用此篇文章
回覆

主題工具

發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼



所有時間均為 +8。現在的時間是 07:35 PM


本站主機由網易虛擬主機代管
Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.