最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解大數(shù)與高精度數(shù)的處理問題

 更新時間:2013年05月24日 16:56:27   作者:  
本篇文章是對大數(shù)與高精度數(shù)的處理進行了詳細的分析介紹,需要的朋友參考下
float和double型數(shù)據(jù)分別是單精度和雙精度型數(shù),他們的取值分別是3.4E+10的負38次方到3.4E+10的38次方,和1.7E+10的負308次方到1.7E+10的308次方。

那么對于float而言,只有6-7位的有效數(shù)字,怎么能裝下可達3.4*10^(-38)這么大的數(shù)呢?同理,15-16位的double型,也無法裝下1.7*10^(-308)這么大的數(shù)???

回答: float 6-7位指的是有效數(shù)字的位數(shù)(精度),而不是數(shù)值大小。例如,3.14159267有9位有效數(shù)字,數(shù)值卻在3~4之間,而350有3位數(shù)字,數(shù)值卻在300~400之間。所以說float數(shù)能達到3.4E+10,但是它的有效數(shù)字位數(shù)只能達到6-7位,如果3.14159267賦值給一個float變量,那么精度將會丟失。例如
復(fù)制代碼 代碼如下:

float a=3234567.1;
float b=3234567;
if( a==b )
    printf("YES");
else
    printf("NO");

將輸出YES,因為a末尾的11超出了float 只能達到6-7位的精度。(如果a=1234567.1;b=3234567)輸入結(jié)果將是NO,為什么呢?這就要我們分析:超出精度的部分怎么處理?不是四舍五入,而是二進制位的丟失。所以說有時候能達到6位的精度,有時候能達到7位的精度,取決于該數(shù)的二進制表示。

那么我們就想怎么表示超長位數(shù),超大精度的數(shù)字呢?
比如123456789123456789123456789(超長30位的大整數(shù));
比如3.14159012345678901234567890123(超高精度30位的小數(shù)),這么長的數(shù)字,long float都存不下來,這就要借助于“字符串”或者“字符數(shù)組”了。

unsigned __int64 n;
無符號__int64類型的變量n,最大值超過了1234567892345678912(20位),可達到約1.8E+19,平常來說應(yīng)該夠用了。

但是__int64類型的數(shù)據(jù)不能用C++里面的cout來輸出,應(yīng)該是cout沒有重載這個類型,如果用printf來輸出,顯然%d, %f, %l都無法滿足20位的精度,網(wǎng)上查到VC6下可以用printf("%I64d\n", n);但是支持的位數(shù)不超過20,經(jīng)我測試,大概超過9.23E+18 輸出的結(jié)果就會出錯了。那么最好的辦法是將“長位數(shù)”轉(zhuǎn)換成字符串,如下:
復(fù)制代碼 代碼如下:

char buffer[65];
printf("%s", _ui64toa(n, buffer,10) );

函數(shù)_ui64toa就是負責將n轉(zhuǎn)換成字符串的,存入字符數(shù)組buffer[65]中,10代表轉(zhuǎn)換成10進制。

數(shù)字轉(zhuǎn)換為字符串,參考程序如下:
復(fù)制代碼 代碼如下:

#include <stdlib.h>
#include <stdio.h>
int main( void )
{
   char buffer[65];
   int r;
   for( r=10; r>=2; --r )
   {
     _itoa( -1, buffer, r );
     printf( "base %d: %s (%d chars)\n", r, buffer, strlen(buffer) );
   }
   printf( "\n" );
   for( r=10; r>=2; --r )
   {
     _i64toa( -1L, buffer, r );
     printf( "base %d: %s (%d chars)\n", r, buffer, strlen(buffer) );
   }
   printf( "\n" );
   for( r=10; r>=2; --r )
   {
     _ui64toa( 0xffffffffffffffffL, buffer, r );
     printf( "base %d: %s (%d chars)\n", r, buffer, strlen(buffer) );
   }
}


復(fù)制代碼 代碼如下:

Output
base 10: -1 (2 chars)
base 9: 12068657453 (11 chars)
base 8: 37777777777 (11 chars)
base 7: 211301422353 (12 chars)
base 6: 1550104015503 (13 chars)
base 5: 32244002423140 (14 chars)
base 4: 3333333333333333 (16 chars)
base 3: 102002022201221111210 (21 chars)
base 2: 11111111111111111111111111111111 (32 chars)

base 10: -1 (2 chars)
base 9: 145808576354216723756 (21 chars)
base 8: 1777777777777777777777 (22 chars)
base 7: 45012021522523134134601 (23 chars)
base 6: 3520522010102100444244423 (25 chars)
base 5: 2214220303114400424121122430 (28 chars)
base 4: 33333333333333333333333333333333 (32 chars)
base 3: 11112220022122120101211020120210210211220 (41 chars)
base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64 chars)

base 10: 18446744073709551615 (20 chars)
base 9: 145808576354216723756 (21 chars)
base 8: 1777777777777777777777 (22 chars)
base 7: 45012021522523134134601 (23 chars)
base 6: 3520522010102100444244423 (25 chars)
base 5: 2214220303114400424121122430 (28 chars)
base 4: 33333333333333333333333333333333 (32 chars)
base 3: 11112220022122120101211020120210210211220 (41 chars)
base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64 chars)

PS:可以用這個函數(shù)來將10進制整數(shù)轉(zhuǎn)換成二進制字符串;
復(fù)制代碼 代碼如下:

int main( void )
{
   char buffer[65];
   _itoa( 12, buffer, 2 );
   printf( "base %d: %s (%d chars)\n", r, buffer, strlen(buffer) );
}

還有一種方法是自己定義字符數(shù)組存放超長位數(shù)的數(shù),小數(shù)點也是可以解決的,然后自己定義這些字符串形式的超長數(shù)之間的運算法則并重載運算符,據(jù)說這樣做運算效率還是蠻高的。

相關(guān)文章

  • C++ STL 序列式容器與配接器的簡單使用

    C++ STL 序列式容器與配接器的簡單使用

    本文主要介紹了C++ STL 序列式容器與配接器的簡單使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-06-06
  • Qt中QDateTimeEdit的具體使用

    Qt中QDateTimeEdit的具體使用

    本文主要介紹了Qt中QDateTimeEdit的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-06-06
  • 如何用C++實現(xiàn)A*尋路算法

    如何用C++實現(xiàn)A*尋路算法

    尋路是游戲比較重要的一個組成部分。因為不僅AI還有很多地方(例如RTS游戲里操控人物點到地圖某個點,然后人物自動尋路走過去)都需要用到自動尋路的功能。本文將介紹一個經(jīng)常被使用且效率理想的尋路方法-A*尋路算法,并且提供額外的優(yōu)化思路
    2021-06-06
  • vector,map,list,queue的區(qū)別詳細解析

    vector,map,list,queue的區(qū)別詳細解析

    如果我們需要隨機訪問一個容器則vector要比list好得多。如果我們已知要存儲元素的個數(shù)則vector 又是一個比list好的選擇。如果我們需要的不只是在容器兩端插入和刪除元素則list顯然要比vector好
    2013-09-09
  • OpenCV畫任意圓弧曲線

    OpenCV畫任意圓弧曲線

    這篇文章主要為大家詳細介紹了OpenCV畫任意圓弧曲線,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++實現(xiàn)LeetCode(79.詞語搜索)

    C++實現(xiàn)LeetCode(79.詞語搜索)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(79.詞語搜索),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++數(shù)據(jù)結(jié)構(gòu)之文件壓縮(哈夫曼樹)實例詳解

    C++數(shù)據(jù)結(jié)構(gòu)之文件壓縮(哈夫曼樹)實例詳解

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之文件壓縮(哈夫曼樹)實例詳解的相關(guān)資料,利用哈夫曼編碼的方式對文件進行壓縮,并且對壓縮文件可以解壓,需要的朋友可以參考下
    2017-07-07
  • 復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實現(xiàn)代碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++使用jsoncpp解析json的方法示例

    C++使用jsoncpp解析json的方法示例

    這篇文章主要介紹了C++使用jsoncpp解析json的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-03-03
  • C語言實現(xiàn)三子棋游戲

    C語言實現(xiàn)三子棋游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)三子棋游戲的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

田东县| 宜丰县| 夏津县| 普定县| 廉江市| 通州区| 文水县| 云梦县| 阜南县| 翁牛特旗| 潮安县| 淮南市| 唐海县| 碌曲县| 手机| 兴海县| 元朗区| 布拖县| 禹州市| 盘山县| 武隆县| 怀仁县| 施秉县| 丰县| 渝北区| 定州市| 上饶县| 全州县| 阳城县| 缙云县| 巧家县| 馆陶县| 鄯善县| 改则县| 佛坪县| 绩溪县| 托克托县| 铜梁县| 老河口市| 商河县| 饶阳县|