python浮点数陷阱

先放一张图

计算机内部对于浮点数处理是不够精确的。

1、浮点数的二进制表示
整数部分:用十进制整数整除以2,得到商和余数,该余数就是二进制数的最低位,然后继续用商整除以2,得到新的商和余数,以此类推,直到商等于0,由所有余数倒排组成了该整数的二进制表现形式。
小数部分:乘以2,取整数0或者1,剩下的小数继续乘2一直重复,直到小数部分为0或达到指定的精度为止

2、存储规则
由于Python封装了C语言的特性,根据国际IEEE754标准进行存储。
IEEE754标准包含一组实数的二进制表示法,由符号位、指数位、尾数位组成,各种精度各部分的位数如下:

3、转换为IEEE754标准的二进制数
规格化
当尾数不为0时,尾数域的最高有效位为1,这称为浮点数的规格化。否则,以修改阶码同时左右移动小数点位置的办法,使其成为规格化数的形式。
32位浮点数:
,S为符号位(0正1负),M为规格化后的小数尾数
64位浮点数:e=E-1023

移码
在真值基础上加2^n(机器字长为n+1),其中2^n>x≥-2^n

举一个简单例子:
1.5=[1.1],符号位为0,指数e=0,规格化后尾数为1.1。

尾数域M右侧以0补全,得尾数域:
M=[100?0000?0000?0000?0000?0000]

阶码E:
E=[0]移?1=[10000000]?1=[01111111]

得1.5的机器码:
1.5=[0011?1111?1100?0000?0000?0000?0000?0000]
十六进制表示为1.5=0x3fc00000。

原文地址:https://blog.51cto.com/9460124/2399841

时间: 2024-10-16 00:00:20

python浮点数陷阱的相关文章

浮点数陷阱

自己运行体会, 凭感觉i是可以等于10的,单却出现死循环,这就是浮点数的陷阱 #include <stdio.h> int main() { double i; for(i = 0; i != 10; i += 0.1) printf("%.1lf\n", i); return 0; }

Python 浮点数的冷知识

本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家. 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b,那么相同索引的元素(如 a[0] .b[0])是否必然相等呢? 若两个对象的 hash 结果相等,即 hash(a) == hash(b),那么它们是否必然相等呢? 答案当然都为否(不然就不叫冷知识了),大家可以先尝试回答一下,然后再往下看. -----思考分割线----- 好了,先来看看第一个问

codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱

#include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <iostream> using namespace std; bool fun(double l1,double r1,double l2,double r2){ return (l1 <= r2 && l1

python 浮点数保留小数

http://www.cnblogs.com/Raymon-Geng/p/5784290.html 这里有三种方法, round(a,2) '%.2f' % a Decimal('5.000').quantize(Decimal('0.00')) 当需要输出的结果要求有两位小数的时候,字符串形式的:'%.2f' % a 方式最好,其次用Decimal. 需要注意的: 1. 可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确. 2. Decimal还可以用来限定

python 浮点数转分数

from fractions import Fraction value = 4.2 print(Fraction(value).limit_denominator()) 原文地址:https://www.cnblogs.com/sea-stream/p/9966066.html

python笔试陷阱1

test_list = [ {'data': 1, 'no': 301}, {'data': 2, 'no': 401}, {'data': 4, 'no': 201}, {'data': 6, 'no': 101}, {'data': 5, 'no': 303} ] new_list = list(test_list) # print(new_list) for match in test_list: if match['no'] > 300: match['no'] = 'BF' else:

python浮点数与整数间的转化

舍弃小数部分 >>> math.trunc(12.533222) 12 >>> round(12.2544) 12 也可以: int(12.0)=12 按给定小数位数四舍五入 >>> round(12.2544, 3) 12.254 向上取整 >>> math.ceil(12.4584) 13 向下取整 >>> math.floor(12.4584) 12 原文地址:https://www.cnblogs.com/y

2015/9/22 Python基础(18):组合、派生和继承

一个类被定义后,目标就是把它当成一个模块来使用,并把这些对象嵌入到你的代码中去,同其他数据类型及逻辑执行流混合使用.有两种方法可以在你的代码中利用类.第一种是组合,就是让不同的类混合并加入到其他类中,来增强功能和代码重用性.你可以在一个大点的类中创建你自己的类的实例,实现一些其他属性和方法来增强原来的类对象.另一种是派生,通过子类从基类继承核心属性,不断地派生扩展功能实现. 组合举例来说,我们想对之前做过的地址本类作加强性设计.如果在设计的过程中,为names.addresses等创建了单独的类

转 python数据类型详解

python数据类型详解 目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(') 用单引号括起来表示字符串,例如: str='this is string'; print str; b.使用双引号(") 双引号中的字符串与单引号中的字符串用法完全相同,例如: str="this is string"; print str; c.使用三引号(''') 利用三