楼主: Mutually_Sincer
880 8

[统计软件] 关于R中一个变量的问题 [推广有奖]

  • 4关注
  • 10粉丝

已卖:56份资源

博士生

89%

还不是VIP/贵宾

-

威望
0
论坛币
6969 个
通用积分
13.9949
学术水平
11 点
热心指数
15 点
信用等级
4 点
经验
4658 点
帖子
204
精华
0
在线时间
357 小时
注册时间
2014-11-4
最后登录
2024-12-13

楼主
Mutually_Sincer 学生认证  发表于 2017-5-15 17:10:05 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. T <- 100
  2. k <- 0.7
  3. a <- T*(1 - k)
  4. b <- T - T*k
复制代码
如上述代码,我们知道a与b的值是相等的,但运行‘a == b’后返回FALSE。说明a与b是不同的两个变量。那么究竟哪里不同呢?用什么函数可以查看这种不同呢?还有我的另外一篇帖子:
https://bbs.pinggu.org/thread-5004830-1-1.html
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


回帖推荐

xugami 发表于4楼  查看完整内容

因为计算机使用二进制保存这些数据,转换为十进制会有误差
wanna be a stargazer

沙发
silver_gp 在职认证  学生认证  发表于 2017-5-15 18:34:12
浮点精度问题。这个是基础的编程问题,浮点数之间比较不允许用== 用sprintf打印a和b,就会发现不同了:
> sprintf("%.20f", a)
[1] "30.00000000000000355271"
> sprintf("%.20f", b)
[1] "30.00000000000000000000"

一般来说,浮点数比较只有在一个情况下才允许用==,就是仅用于直接赋值的情况,例如
a <- 25.99999
b <- 25.99999
> g == h
[1] TRUE

其他情况下,要比较浮点数,需要这么做:
> abs(a-b) < 0.0001
[1] TRUE

就是说,允许一定精度内的误差。楼主明白了吧?

藤椅
Mutually_Sincer 学生认证  发表于 2017-5-16 08:38:52
silver_gp 发表于 2017-5-15 17:10
浮点精度问题。这个是基础的编程问题,浮点数之间比较不允许用== 用sprintf打印a和b,就会发现不同了:
>  ...
谢谢,明白了a与b的不同。
但是照你所说,那是什么原因导致了精度不同呢?类似于你的方法,在查看T*(1 - 0.3) 与T*(1 - 0.7)的精度时,结果如下:
> sprintf("%.30f", T*(1- 0.3))
[1] "70.000000000000000000000000000000"
> sprintf("%.30f", T*(1- 0.7))
[1] "30.000000000000003552713678800501"
而:
> sprintf("%.30f", 0.3)
[1] "0.299999999999999988897769753748"
> sprintf("%.30f", 0.7)
[1] "0.699999999999999955591079014994"
那这是什么原因呢?

板凳
xugami 学生认证  发表于 2017-5-16 09:29:47 来自手机
因为计算机使用二进制保存这些数据,转换为十进制会有误差

报纸
xugami 学生认证  发表于 2017-5-16 09:30:38 来自手机
因为计算机使用二进制保存这些数据,转换为十进制会有误差

地板
Mutually_Sincer 学生认证  发表于 2017-5-16 10:33:19
xugami 发表于 2017-5-16 09:29
因为计算机使用二进制保存这些数据,转换为十进制会有误差
使用二进制这我知道,转换为十进制有误差也能理解,但是0.3、0.7有误差,怎么乘100之后有的有误差,有的误差就没有了呢?
> sprintf("%.40f", 100*0.3)
[1] "30.0000000000000000000000000000000000000000"
> sprintf("%.40f", 100*(1-0.7))
[1] "30.0000000000000035527136788005009293556213"
导致这种结果出现的原因是什么?

7
xugami 学生认证  发表于 2017-5-16 10:44:50
Mutually_Sincer 发表于 2017-5-16 10:33
使用二进制这我知道,转换为十进制有误差也能理解,但是0.3、0.7有误差,怎么乘100之后有的有误差,有的误 ...
转换为整数部分是不会有误差的,除非内存不够;小数部分会有误差

8
silver_gp 在职认证  学生认证  发表于 2017-5-16 10:58:08
这涉及到浮点数IEEE标准,这里有个比较清楚的解释,楼主请看:
http://blog.csdn.net/iloli/article/details/8447571
总的来说,就是32bit的float是无法表示二进制小数部分很靠后的一些位数的,位数限制导致了截断,只有小数部分会有误差,而整数部分是可以精确表示的。

9
Mutually_Sincer 学生认证  发表于 2017-5-16 11:33:53
silver_gp 发表于 2017-5-16 10:58
这涉及到浮点数IEEE标准,这里有个比较清楚的解释,楼主请看:
http://blog.csdn.net/iloli/article/detai ...
原来是这样。
谢谢

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2026-1-3 03:21