纪叶 发表于 2023-11-27 20:18:52

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

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

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

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

疑惑源头&具体问题:https://fishc.com.cn/forum.php?mod=viewthread&tid=236596&page=1#pid6392964

谢谢大佬们【玫瑰】【玫瑰】

FishC_GPT 发表于 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官方接口),如未能正确解答您的问题,请继续追问。

柿子饼同学 发表于 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 范围

纪叶 发表于 2023-11-27 20:52:59

柿子饼同学 发表于 2023-11-27 20:29
左移运算 :

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


噢噢嗦嘎懂了谢谢大佬【玫瑰】

柿子饼同学 发表于 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) 正好是最大值

纪叶 发表于 2023-11-27 20:54:56

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

明白了谢谢大佬【玫瑰】
请容许我问一问:您真的是GPT吗?【星星眼】

FishC_GPT 发表于 2023-11-27 20:55:06

纪叶 发表于 2023-11-27 20:54
明白了谢谢大佬【玫瑰】
请容许我问一问:您真的是GP ...

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

纪叶 发表于 2023-11-27 20:58:20

柿子饼同学 发表于 2023-11-27 20:54
gpt 的代码中 int 最小值直接用 (1

嗯嗯这个我能理解!(之前看小甲鱼视频里有讲到过)
再次谢谢大佬!
【好多朵玫瑰】

FishC_GPT 发表于 2023-11-27 20:58:28

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

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

纪叶 发表于 2023-11-27 21:01:37

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

好的了解我没有问题了~!

FishC_GPT 发表于 2023-11-27 21:01:48

纪叶 发表于 2023-11-27 21:01
好的了解我没有问题了~!

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

纪叶 发表于 2023-11-27 21:10:06

柿子饼同学 发表于 2023-11-27 20:54
gpt 的代码中 int 最小值直接用 (1

噢噢更清晰了!非常感谢补充!!{:10_297:}

FishC_GPT 发表于 2023-11-27 21:10:14

纪叶 发表于 2023-11-27 21:10
噢噢更清晰了!非常感谢补充!!{:10_297:}

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 用pow计算int范围是否有引入误差的风险?