pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

為什么 4*0.1 的浮點值在 Python 3 中看起來不錯,但

Why does the floating-point value of 4*0.1 look nice in Python 3 but 3*0.1 doesn#39;t?(為什么 4*0.1 的浮點值在 Python 3 中看起來不錯,但 3*0.1 不好看?)
本文介紹了為什么 4*0.1 的浮點值在 Python 3 中看起來不錯,但 3*0.1 不好看?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我知道大多數小數都沒有精確的浮點表示(浮點數學有問題嗎?).p>

但我不明白為什么 4*0.1 可以很好地打印為 0.4,但 3*0.1 不是,當這兩個值實際上都有丑陋的十進制表示:

>>>3*0.10.30000000000000004>>>4*0.10.4>>>從十進制導入十進制>>>十進制(3*0.1)十進制('0.30000000000000000444089209850062616169452667236328125')>>>十進制(4*0.1)十進制('0.400000000000000002220446049250313080847263336181640625')

解決方案

簡單的答案是因為 3*0.1 != 0.3 由于量化(舍入)誤差(而 4*0.1== 0.4 因為乘以 2 的冪通常是精確"運算).Python 試圖找到可以四舍五入到所需值的最短字符串,因此它可以將 4*0.1 顯示為 0.4,因為它們是相等的,但它不能將 3*0.1 顯示為 0.3 因為它們不相等.

您可以使用 Python 中的 .hex 方法查看數字的內部表示(基本上是 exact 二進制浮點值,而不是 base-10近似).這有助于解釋幕后發生的事情.

>>>(0.1).hex()'0x1.999999999999ap-4'>>>(0.3).hex()'0x1.3333333333333p-2'>>>(0.1*3).hex()'0x1.3333333333334p-2'>>>(0.4).hex()'0x1.999999999999ap-2'>>>(0.1*4).hex()'0x1.999999999999ap-2'

0.1 是 0x1.999999999999a 乘以 2^-4.一個"最后表示數字 10 - 換句話說,二進制浮點中的 0.1 非常輕微 比精確"大.值 0.1(因為最終的 0x0.99 向上舍入為 0x0.a).當您將此乘以 4(2 的冪)時,指數會向上移動(從 2^-4 到 2^-2),但數字不會改變,因此 4*0.1 == 0.4.

但是,當您乘以 3 時,0x0.99 和 0x0.a0 (0x0.07) 之間的微小差異會放大為 0x0.15 錯誤,在最后一個位置顯示為一位數錯誤.這會導致 0.1*3 比 0.3 的舍入值非常輕微大.

Python 3 的浮點 repr 被設計為 round-trippable,也就是說,顯示的值應該完全可以轉換為原始值(float(repr(f)) == f 對于所有浮點數 f).因此,它不能以完全相同的方式顯示0.30.1*3,否則兩個不同的數字會在往返后最終相同.因此,Python 3 的 repr 引擎選擇顯示一個帶有輕微明顯錯誤的文件.

I know that most decimals don't have an exact floating point representation (Is floating point math broken?).

But I don't see why 4*0.1 is printed nicely as 0.4, but 3*0.1 isn't, when both values actually have ugly decimal representations:

>>> 3*0.1
0.30000000000000004
>>> 4*0.1
0.4
>>> from decimal import Decimal
>>> Decimal(3*0.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(4*0.1)
Decimal('0.40000000000000002220446049250313080847263336181640625')

解決方案

The simple answer is because 3*0.1 != 0.3 due to quantization (roundoff) error (whereas 4*0.1 == 0.4 because multiplying by a power of two is usually an "exact" operation). Python tries to find the shortest string that would round to the desired value, so it can display 4*0.1 as 0.4 as these are equal, but it cannot display 3*0.1 as 0.3 because these are not equal.

You can use the .hex method in Python to view the internal representation of a number (basically, the exact binary floating point value, rather than the base-10 approximation). This can help to explain what's going on under the hood.

>>> (0.1).hex()
'0x1.999999999999ap-4'
>>> (0.3).hex()
'0x1.3333333333333p-2'
>>> (0.1*3).hex()
'0x1.3333333333334p-2'
>>> (0.4).hex()
'0x1.999999999999ap-2'
>>> (0.1*4).hex()
'0x1.999999999999ap-2'

0.1 is 0x1.999999999999a times 2^-4. The "a" at the end means the digit 10 - in other words, 0.1 in binary floating point is very slightly larger than the "exact" value of 0.1 (because the final 0x0.99 is rounded up to 0x0.a). When you multiply this by 4, a power of two, the exponent shifts up (from 2^-4 to 2^-2) but the number is otherwise unchanged, so 4*0.1 == 0.4.

However, when you multiply by 3, the tiny little difference between 0x0.99 and 0x0.a0 (0x0.07) magnifies into a 0x0.15 error, which shows up as a one-digit error in the last position. This causes 0.1*3 to be very slightly larger than the rounded value of 0.3.

Python 3's float repr is designed to be round-trippable, that is, the value shown should be exactly convertible into the original value (float(repr(f)) == f for all floats f). Therefore, it cannot display 0.3 and 0.1*3 exactly the same way, or the two different numbers would end up the same after round-tripping. Consequently, Python 3's repr engine chooses to display one with a slight apparent error.

這篇關于為什么 4*0.1 的浮點值在 Python 3 中看起來不錯,但 3*0.1 不好看?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Python 3 Float Decimal Points/Precision(Python 3 浮點小數點/精度)
Converting Float to Dollars and Cents(將浮點數轉換為美元和美分)
What are some possible calculations with numpy or scipy that can return a NaN?(numpy 或 scipy 有哪些可能的計算可以返回 NaN?)
Python float to ratio(Python浮動比率)
How to manage division of huge numbers in Python?(如何在 Python 中管理大量數字的除法?)
mean from pandas and numpy differ(pandas 和 numpy 的意思不同)
主站蜘蛛池模板: 在线PH计-氧化锆分析仪-在线浊度仪-在线溶氧仪- 无锡朝达 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 电销卡 防封电销卡 不封号电销卡 电话销售卡 白名单电销卡 电销系统 外呼系统 | 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 | 安徽成考网-安徽成人高考网 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 棕刚玉-白刚玉厂家价格_巩义市东翔净水材料厂 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 济南办公室装修-厂房装修-商铺装修-工装公司-山东鲁工装饰设计 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 北京乾茂兴业科技发展有限公司 | 清管器,管道清管器,聚氨酯发泡球,清管球 - 承德嘉拓设备 | Duoguan 夺冠集团 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | bkzzy在职研究生网 - 在职研究生招生信息咨询平台 | 优宝-汽车润滑脂-轴承润滑脂-高温齿轮润滑油脂厂家 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 无机纤维喷涂棉-喷涂棉施工工程-山东华泉建筑工程有限公司▲ | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 广州各区危化证办理_危险化学品经营许可证代办 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 液氮罐(生物液氮罐)百科-无锡爱思科| 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 预制直埋蒸汽保温管-直埋管道-聚氨酯发泡保温管厂家 - 唐山市吉祥保温工贸有限公司 | 温室大棚建设|水肥一体化|物联网系统 |