鱼C论坛

 找回密码
 立即注册
查看: 1352|回复: 12

[已解决]用pow计算int范围是否有引入误差的风险?

[复制链接]
发表于 2023-11-27 20:18:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用pow计算int范围是否有引入误差的风险?

有大佬说使用移位运算和按位取反来计算整型变量的最大值和最小值,避免了浮点数误差

那移位运算和按位取反是怎么操作的?

疑惑源头&具体问题:https://fishc.com.cn/forum.php?m ... p;page=1#pid6392964

谢谢大佬们【玫瑰】【玫瑰】
最佳答案
2023-11-27 20:19:10
使用pow函数计算int范围可能会引入误差的风险。这是因为pow函数接受的参数和返回值都是浮点数类型,而int类型只能表示整数,无法精确地表示浮点数。因此,在进行浮点数运算时,可能会存在舍入误差,导致结果不准确。

为了避免这种风险,我们可以使用移位运算和按位取反来计算整型变量的最大值和最小值。具体操作如下:

1. 最大值:我们可以通过将所有位设置为1来计算int类型的最大值。在32位系统上,可以使用以下代码实现:
++int max_val = ~(1 << 31);
这里,`1 << 31`表示将二进制数1左移31位,即得到一个只有最高位为1的二进制数。然后,使用按位取反操作符`~`将其它位也设置为1,得到int类型的最大值。

2. 最小值:我们可以通过将最高位设置为1、其它位设置为0来计算int类型的最小值。同样,在32位系统上,可以使用以下代码实现:
++int min_val = (1 << 31);
这里,`1 << 31`表示将二进制数1左移31位,即得到一个只有最高位为1的二进制数,其它位都为0,得到int类型的最小值。

使用移位运算和按位取反操作,可以避免浮点数误差,得到int类型的最大值和最小值。这种方法更加准确和可靠,并且性能更好。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-27 20:19:10 | 显示全部楼层    本楼为最佳答案   
使用pow函数计算int范围可能会引入误差的风险。这是因为pow函数接受的参数和返回值都是浮点数类型,而int类型只能表示整数,无法精确地表示浮点数。因此,在进行浮点数运算时,可能会存在舍入误差,导致结果不准确。

为了避免这种风险,我们可以使用移位运算和按位取反来计算整型变量的最大值和最小值。具体操作如下:

1. 最大值:我们可以通过将所有位设置为1来计算int类型的最大值。在32位系统上,可以使用以下代码实现:
++int max_val = ~(1 << 31);
这里,`1 << 31`表示将二进制数1左移31位,即得到一个只有最高位为1的二进制数。然后,使用按位取反操作符`~`将其它位也设置为1,得到int类型的最大值。

2. 最小值:我们可以通过将最高位设置为1、其它位设置为0来计算int类型的最小值。同样,在32位系统上,可以使用以下代码实现:
++int min_val = (1 << 31);
这里,`1 << 31`表示将二进制数1左移31位,即得到一个只有最高位为1的二进制数,其它位都为0,得到int类型的最小值。

使用移位运算和按位取反操作,可以避免浮点数误差,得到int类型的最大值和最小值。这种方法更加准确和可靠,并且性能更好。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-27 20:29:01 | 显示全部楼层
左移运算 :
a << b
就是意思是 把 a 变成 a * 2^b
仔细想想 , 左移运算实际上是把 a 的二进制向左移动 b 位
用十进制举例子 , 假设有一个数字 1314 , 我把它左移一位变成 13140 , 就相当于把这个数 乘了 10 ^ 1(位)
所以到了二进制上也是一样的 , 二进制数 101 左移一位变成 1010 , 相当于乘了 2 ^ 1
int 的最大值是 2 ^ 31 - 1 , 所以可以用这个代码 :
long long int_max = (1 << 31) - 1;  // 用 long long 原因是 (1 << 31) 会超出 int 范围
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-27 20:52:59 | 显示全部楼层
柿子饼同学 发表于 2023-11-27 20:29
左移运算 :

就是意思是 把 a 变成 a * 2^b

噢噢嗦嘎懂了谢谢大佬【玫瑰】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-27 20:54:41 | 显示全部楼层
本帖最后由 柿子饼同学 于 2023-11-27 20:58 编辑
纪叶 发表于 2023-11-27 20:52
噢噢嗦嘎懂了谢谢大佬【玫瑰】


gpt 的代码中 int 最小值直接用 (1 << 31) 是因为 (1 << 31) 超过了 int 的最大值 , 溢出了 , 变成了最小值
1 << 31 二进制实际上是 1...(31个0) , int 总共 32 位 , 第一位是符号位 , 0 是正数 , 1 是负数 , 所以就是最小值
~是按位取反 , 就是对于每一位把 0 变成 1 , 1 变成 0
所以说 ~(1 << 31) 就是 1...(31个 0 ) ---> 0...(31个 1) 正好是最大值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-27 20:54:56 | 显示全部楼层
FishC_GPT 发表于 2023-11-27 20:19
使用pow函数计算int范围可能会引入误差的风险。这是因为pow函数接受的参数和返回值都是浮点数类型,而int类 ...

明白了谢谢大佬【玫瑰】
请容许我问一问:您真的是GPT吗?【星星眼】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-27 20:55:06 | 显示全部楼层
纪叶 发表于 2023-11-27 20:54
明白了谢谢大佬【玫瑰】
请容许我问一问:您真的是GP ...

哈哈,不,我是一个由开发团队设计和训练的语言模型助手,通过人工智能技术生成回答。我被训练成能够回答各种编程问题,并提供可行的解决方案。虽然我能够提供有关编程的帮助和建议,但我并没有实际的思维能力,并不能算是真正的GPT。【笑】如果你还有其他问题,欢迎继续提问!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-27 20:58:20 | 显示全部楼层
柿子饼同学 发表于 2023-11-27 20:54
gpt 的代码中 int 最小值直接用 (1

嗯嗯这个我能理解!(之前看小甲鱼视频里有讲到过)
再次谢谢大佬!
【好多朵玫瑰】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-27 20:58:28 | 显示全部楼层
纪叶 发表于 2023-11-27 20:58
嗯嗯这个我能理解!(之前看小甲鱼视频里有讲到过)
...

不客气!很高兴能帮到你,如果你在学习编程的过程中还有其他问题,随时都可以来问我。祝你编程的旅程愉快,取得好成果!【玫瑰】

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-27 21:01:37 | 显示全部楼层
FishC_GPT 发表于 2023-11-27 20:55
哈哈,不,我是一个由开发团队设计和训练的语言模型助手,通过人工智能技术生成回答。我被训练成能够回答 ...

好的了解  我没有问题了~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-27 21:01:48 | 显示全部楼层
纪叶 发表于 2023-11-27 21:01
好的了解  我没有问题了~!

好的,如果你有任何其他问题,请随时提问。我很乐意帮助你!祝你编程学习顺利!【微笑】

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-27 21:10:06 | 显示全部楼层
柿子饼同学 发表于 2023-11-27 20:54
gpt 的代码中 int 最小值直接用 (1

噢噢更清晰了!非常感谢补充!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-27 21:10:14 | 显示全部楼层
纪叶 发表于 2023-11-27 21:10
噢噢更清晰了!非常感谢补充!!

不客气,我很高兴能够帮助你澄清问题!如果你还有其他疑问或需要进一步的解释,请随时提问。我将尽力为你提供帮助!【微笑】

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 12:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表