欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)云和免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

在Win32下,把int, 指針地址,long等4字節(jié)整數(shù)賦給一個(gè)double后,再用該double數(shù)賦給原始類型的數(shù),得到的結(jié)果于最初的數(shù)值一致,即不存在任何精度丟失。例如下面的結(jié)果將總是true:

 long a=123456; //assign any long number here
 double db=a;
 long b=db;
 printf("%s\n",a==b?"true":"false");

但是對于long long或win64下的指針地址等8字節(jié)整數(shù)將存在精度丟失,于是對這方面做了一個(gè)簡單的測試:

#include<iostream>
#include<stdlib.h>

void showEncodeOfDouble(unsigned char* db){

 const int ByteLength=8; 
 for(int i=ByteLength-1;i>=0;i--) 
  printf(" %.2x",db[i]);

 printf("\n");

}


int main(){
 
 unsigned long long maxULL=0xffffffffffffffff; //2^64-1=18446744073709551615,
             //max unsigned long long
 printf("%llu\n",maxULL);

 double d1=maxULL;        //20bit Significant,Precision Loss 
 printf("%f\n",d1);      

 maxULL=d1;
 printf("%llu\n",maxULL);
 
 showEncodeOfDouble((unsigned char*)&d1);

 system("pause");
 return 0;
}

輸出的結(jié)果如下(visual studio,win32):

18446744073709551615
18446744073709552000.000000
9223372036854775808
 43 f0 00 00 00 00 00 00

至此,有兩點(diǎn)疑問(暫時(shí)不理會(huì)代碼中showEncodeOfDouble的結(jié)果):

  1)為什么丟失精度后得到的double數(shù)是18446744073709552000.000000?
  2)為什么將double數(shù)重新轉(zhuǎn)化為unsigned long long后得到的數(shù)又和double不一致呢?

對于這兩個(gè)問題,需要對C++浮點(diǎn)數(shù)的規(guī)格有一定的了解。

1  IEEE浮點(diǎn)標(biāo)準(zhǔn)

C/C++采用的是IEEE浮點(diǎn)標(biāo)準(zhǔn),它以“二進(jìn)制的科學(xué)表示法”表示一個(gè)小數(shù):

C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么

其中M是一個(gè)整數(shù)部分僅有一位的二進(jìn)制小數(shù),例如1.011,表示十進(jìn)制下的1.375。E表示該小數(shù)以2為底時(shí)的階數(shù)?;谝陨系谋硎痉绞?,小數(shù)需要對三部分進(jìn)行編碼:表示符號的s,及階碼E、尾數(shù)碼M。C++中的double類型三種編碼所占的位數(shù)如圖所示。

C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么

53位尾數(shù)碼所能達(dá)到的精度為53二進(jìn)制位,約為16 個(gè)十進(jìn)制位( 53 log10(2) ≈ 15.955) [1],尾數(shù)碼的編碼中還有一個(gè)隱含的開頭整數(shù)位1(或0,當(dāng)11位階碼全0時(shí))因此實(shí)際中可得15-17位十進(jìn)制的精度。當(dāng)有效位數(shù)最多15位的十進(jìn)制數(shù)轉(zhuǎn)換成double然后重新轉(zhuǎn)換為原來的十進(jìn)制類型時(shí),數(shù)值保持一致;另一方面,將一個(gè)double數(shù)轉(zhuǎn)化為可以容納17位以上有效數(shù)字的十進(jìn)制數(shù)再重新轉(zhuǎn)化為double,結(jié)果數(shù)值也保持一致。

這就解釋了為什么4字節(jié)的整數(shù)轉(zhuǎn)化為double重新轉(zhuǎn)化能保持一致(2^32=4294967296僅10個(gè)有效位),而8字節(jié)的整數(shù)卻可能丟失精度(2^64-1=18446744073709551615共20個(gè)有效位)。但第一個(gè)問題中整數(shù)丟失精度后轉(zhuǎn)化成的double數(shù)值是怎么來的呢,這需要了解C++階碼和尾數(shù)對于double數(shù)值的意義。

2 階碼編碼和尾數(shù)編碼

在階碼編碼中,有一個(gè)常數(shù)偏置量Bias=1023,假設(shè)11位階碼所代表的無符號整數(shù)值為e,

1)若e不為0(11位全為1時(shí)用于表示特殊數(shù)字,此處不討論),則double數(shù)值為

C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么

2)若e=0,則小數(shù)值為

C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么

那么,可以看函數(shù)showEncodeOfDouble了,它的作用是將一個(gè)double數(shù)的編碼按字節(jié)打印出來(左邊是高字節(jié)),按其打印結(jié)果按照上面計(jì)算,可知double編碼值表示的數(shù)值是2^64,這是合理的,當(dāng)把精度較高的整數(shù)轉(zhuǎn)化為double時(shí),C++采用向偶數(shù)舍入的方式得到最接近的值[2]。至于打印出的結(jié)果,屬于C++浮點(diǎn)數(shù)打印中的細(xì)節(jié)問題。

3 C++浮點(diǎn)數(shù)打印

許多C/C++的庫中在輸出double時(shí),通常有意使得輸出結(jié)果簡短些(即使設(shè)置了足夠多的可見位數(shù)),以避免較大位數(shù)的輸出。直接使用C中的printf或cout打印double數(shù)時(shí),打印顯示的結(jié)果也有可能是帶有精度丟失的結(jié)果,可使用16進(jìn)制的方式打印出更精確的double:

printf("%a\n",d1);

得到的輸出結(jié)果為:

0x1.000000p+64

至此問題1實(shí)際上只是C++中,將高精度整數(shù)轉(zhuǎn)double時(shí)的偶數(shù)舍入問題。

對于問題2,從float或double轉(zhuǎn)換成int,值將會(huì)被向零舍入.例如1.999將被轉(zhuǎn)換成1而-1.999將會(huì)被轉(zhuǎn)換成-1。進(jìn)一步來說,值有可能會(huì)溢出。C語言標(biāo)準(zhǔn)沒有對這種情況指出固定的結(jié)果,這種轉(zhuǎn)換行為是無定義的。

以上就是C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:C++中double浮點(diǎn)數(shù)出現(xiàn)丟失精度的原因是什么-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://aaarwkj.com/article42/dihohc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、微信公眾號軟件開發(fā)、服務(wù)器托管、響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
精品人妻一区二区三区蜜桃视频| 日韩中文字幕在线首页| 日本一区二区精美视频| 精品啪啪高潮一区二区| 亚洲高清无毛一区二区| 亚洲欧洲精品专线九九| 性生活真实视频免费看| 日韩精品一区二区视频| 亚洲精品国产精品粉嫩av| 本色啪啪人妻夜嗨嗨av| 久久av免费一区二区观看| 国产精品一区二区久久蜜桃麻豆| 成人爱爱视频免费观看| 午夜视频在线观看91| 久久精品国产一区二区三| 国产成人在线观看av| 亚洲婷婷综合精品五月天| 亚洲各类熟女们中文字幕| 午夜少妇久久久久久久久| 精品久久中文字幕久久av| 国产叼嘿一区二区视频| 日韩欧美亚洲自拍另类| 蜜桃av网站免费观看| 性生活的视频免费观看麻豆 | 午夜福利片在线观看视频| 天天操天天日天天干夜夜情欢| 亚洲国产黄色美女视频| 亚洲精品成人免费电影| 久久热久久热在线视频| 97成人在线视频免费| 亚洲黄色片一区二区三区| 双高干文男女主都很强| 亚洲国产欧美日韩综合| 亚洲欧美激情啪啪啪| 四虎精品永久在线视频| 国产丝袜美腿在线观看| 亚洲av毛片在线网站| 天堂av一区二区在线播放| 亚洲不卡免费在线视频| 国产精品免费视频能看的| 人妻日韩字幕一区二区|