楼主: luchany
2105 9

[问答] R语言 循环结果得到inf怎么办 需要输出具体值 [推广有奖]

  • 0关注
  • 0粉丝

小学生

0%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
53 点
帖子
2
精华
0
在线时间
6 小时
注册时间
2022-7-26
最后登录
2024-4-19

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
编写算法时 得到的循环结果太大溢出 输出inf 应该如何解决?楼主需要输出具体数值

二维码

扫码加我 拉你入群

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

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

关键词:R语言 怎么办

沙发
oliyiyi 发表于 2022-7-27 11:38:08 |只看作者 |坛友微信交流群
用while循环,控制次数

使用道具

藤椅
luchany 发表于 2022-7-27 21:38:42 |只看作者 |坛友微信交流群
oliyiyi 发表于 2022-7-27 11:38
用while循环,控制次数
已经控制了循环次数 但是由于乘积项太多且每一项都是0-1之间的小数 取对数作加和再用指数回复 就会得到-inf 该怎么办啊

使用道具

板凳
jnutt 学生认证  发表于 2022-7-28 08:34:18 |只看作者 |坛友微信交流群
这个超过R语言允许的最大值,还能怎么办。。分100份输出?然后导出来自己加总

使用道具

报纸
abelus 发表于 2022-7-29 16:34:25 |只看作者 |坛友微信交流群
如果要精确,那就只能自己写个向量来表示多位数的乘法了
如果可以接受近似,那么每个数转成
1.a * 10^(-b)的形式
第一列表示一个1到10之间的数(如果考虑正负号,那就搞成三列),这样相乘得到值
第二列表示10的乘幂,相加就好了

如果这是真实的算法,这算法可能没啥用处
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

使用道具

地板
abelus 发表于 2022-7-29 16:42:34 |只看作者 |坛友微信交流群
用这个做例子可能更清晰一些,或者直接用exp(1)做base也可以,用10是为了和十进制表示一致,更容易理解。
x <- exp(runif(100, -20, -10))
b <- 1 - as.integer(log(x, 10))
a <- x * (10 ^ b)
prod(a) * (10^sum(-b))

使用道具

7
tiesuoqiao 发表于 2022-8-1 00:59:36 |只看作者 |坛友微信交流群
luchany 发表于 2022-7-27 21:38
已经控制了循环次数 但是由于乘积项太多且每一项都是0-1之间的小数 取对数作加和再用指数回复 就会得到-i ...
为什么要取对数?
都在(0,1),最后相乘肯定也在这个范围

直接乘不好吗?有了计算机,实在没必要通过对数转换计算乘法

使用道具

8
biubiubiunice 发表于 2022-8-2 10:13:37 |只看作者 |坛友微信交流群
好像有个专门处理大数据的叫arrow project 楼主可以试试

使用道具

9
JGyangzhi 发表于 2022-8-4 12:19:47 |只看作者 |坛友微信交流群
1. 每个值都是 0~1 之间的小数。每次乘之后,小数点后的 0 会越来越多。
2. 初始化循环使用变量 len_all_zero <- 0
3. 循环:
3.1  乘一次,得一次结果。此值是 a
3.2  把此结果转化为字符串,再把此字符串转化为每个数字对应一个字符的向量。此向量是 char_a。此向量的长度length(char_a) 。
       此向量的格式大概是 c('0', '.', '0', '0', '0', '1', '2', '3'),前2位是c('0', '.')。令
        len_this_cycle_zero <- lenght(char_a) - 2。
3.3  把 乘的结果 a 化为整数得 A = a * len_zero。
3.4  len_all_zero <- len_all_zero + len_this_cycle_zero。len_all_zero 就是每次循环里,把计算结果的小数化为整数乘以的“10的倍数”,也是
      循环结束后,把最终结果再化为小数除以的“10的倍数”。

如:
      0.01 * 0.01 = 0.0001  ———— c('0', '.', '0', '0', '0',  '1') 长6,减去2,得 6-2 =4
      0.0001 * (10*4) = 1
      再次循环 1 * 0.01 = 0.01 ———— c('0', '.', '0', '1') 长4,减去2,得 4-2 = 2
      0.01 * (10*2) = 1
      两次循环结果1,再化为实际计算结果是 1/(10*10*10*10  * 10*10) = 1 / 1000000 = 0.000001
      即,0.01 * 0.01 * 0.01 = 0.000001

数值化为字符向量的代码:
  1. library(stringr)
  2. num <- 0.000012034
  3. char_num <- "0.000012034"
  4. len_char_num <- nchar(char_num)
  5. char_vector <- rep(NA, len_char_num)
  6. for(i in 1:len_char_num){
  7.   this_cycle_char <- substr(char_num, i, i)
  8.   char_vector[i] <- this_cycle_char
  9. }
  10. char_vector
复制代码


使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-8 12:46