不堪大用的pow

2024-04-04 19:04
文章标签 pow 不堪 大用

本文主要是介绍不堪大用的pow,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目描述】

输出100~999中的所有水仙花数。若3位数ABC满足,则称其为水仙花

数。例如,所以153是水仙花数。

【题目来源】

刘汝佳《算法竞赛入门经典  第2版》习题2-1 水仙花数(daffodil)

题目很简单,利用分离整数的方法将数字分离后判断是否满足水仙花数条件即可,代码如下:

#include<stdio.h>
int main(){for(int i=100; i<=999; i++){int ge = i%10;int shi = i/10%10;int bai = i/100;if(i == bai*bai*bai + shi*shi*shi + ge*ge*ge){printf("%d\n", i);}}return 0;
}

为什么这样的数会叫“水仙花数”呢?

它源于一个古老的传说。说有一位名叫纳西塞斯的年轻人,他过于自恋,看到水中自己的影子不能自已,于是纵身一扑……

在他死去的地方,长出了一株水仙花。

人们为了纪念这位自恋的年轻人,将这种同样有自恋特质的数命名为“水仙花数”。

如果把水仙花数的公式写成下面这种形式,你就能充分品味出它的自恋特质了。

ABC = A*A*A + B*B*B + C*C*C

不过,这里老金想提的是另一个问题:假设用pow()函数求立方有没有问题?

本题老金测试过是完全没有问题的。但网上普遍说pow()因为浮点数的原因是存在误差的,即便底数和指数都是整数。

老金不知道pow()的内部实现是什么样的(据说算法非常复杂),但老金知道,整数值是不会产生浮点数误差的,导致出现误差的是小数部分(详见《浮点数产生误差的根源》一文),所以老金认为,当底数和指数都是整数时,按理pow()函数也是不应该产生误差的。

实践是检验真理的唯一标准,编段代码测试一下:

#include<stdio.h>
#include<math.h>
int main(){long long a, b; //x的y次幂:a用循环求,b用pow求int cnt=0, cnt_dif=0; //记录计算次数、差异次数for(int x=1; x<=100; x++){for(int y=1; y<=9; y++){b = pow(x,y);a=1;for(int z=1; z<=y; z++){a *= x;}if(a != b){printf("%d %d %lld %lld\n", x, y, a, b);cnt_dif++;}cnt++;}}printf("%d %d", cnt, cnt_dif);return 0;
}

思路很简单,分别用循环的方式和pow函数求出x的y次幂,对比二者的值是否一致,不一致就打印出来。

输出结果:

pow函数实在是不争气,辜负了老金的期望,900次运算中竟有21次产生了误差。

大哥,就是有一次也不行啊!

从上面的运行结果可以看出,产生误差的数都是非常大的幂(106以上)。此外,指数基本都是9,只有一个是8,说明指数越大,越容易产生误差。

不管怎么样,这个结果都证明了即便底数和指数都是整数,当幂的值变得足够大时,就会产生误差。

综上,避免用pow还是对的。

这篇关于不堪大用的pow的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/876610

相关文章

pow函数的性能测试

昨天在PKU上做了一题2187,限时3s。 算法主要耗时在多次求不同整数的平方。 当用pow函数求时,超时; 而直接乘才232ms。 相差也太大了吧。 于是就写了一段代码来测试pow的性能 首先产生10000个随机整数,然后重复1000次求整数的平方 #include <iostream>#include <cmath>#include <ctime>using Namespace std

50. Pow(x,n)

题目: 解答: 主要是求 n &gt; 0 n &gt; 0 n>0 的情况的计算,其他时候,可以通过转换得到。 而 n &gt; 0 n &gt; 0 n>0 的情况下, ​ n = a 0 2 0 + a 1 2 1 + a 2 2 2 … a m 2 m n = a_0 2^0 + a_1 2^1 + a_2 2^2 \ldots a_m 2^m n=a0​20+a1​21

pow(x, n).

Implement pow(x, n). 思路:只用判断n的情况,0,1,-1,然后判断n的奇偶,和符号; class Solution {public double myPow(double x, int n) {if(n == 0) return 1.0;if(n == 1) return x;if(n == -1) return 1.0 / x;double half = myPow(x

Super Pow

Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array. Example1: a = 2b = [3]Result: 8 Example2: a = 2

Pytorch:Tensor基本运算【add/sub/mul/div:加减乘除】【mm/matmul:矩阵相乘】【Pow/Sqrt/rsqrt:次方】【近似:floor...】【裁剪:clamp】

一、基本运算:加减乘除 1、乘法 1.1 a * b:element-wise 对应元素相乘 a * b:要求两个矩阵维度完全一致,即两个矩阵对应元素相乘,输出的维度也和原矩阵维度相同 1.2 torch.mul(a, b):element-wise 对应元素相乘 torch.mul(a, b):是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1,

leetcode 刷题之路 36 Pow(x, n)

Implement pow(x, n). 通过循环n次相乘的方法可以得到结果,但是时间效率不高,可能会引起Time Limited Exceed错误。 采用二分法可以达到O(logn)的时间复杂度,采用递归比较容易实现,需要注意的是当输入为-2147483648时,是不能直接变化成1.0/pow(-n)的,因为整数中负数的范围是-2147483648到2147483647,-214748364

Leetcode19: Pow(x,n)

Implement pow(x, n). class Solution {public:double myPow(double x, int n) {if(n == 0)return 1.0;if(n < 0)return 1.0/myPow(x, -n);double half = myPow(x, n>>1);if(n%2 == 0)return half*half;elseretur

50.实现 pow(x, n)函数的算法 ,计算 x 的 n 次幂函数

50. Pow(x, n) 题目 实现 pow(x, n),计算 x 的 n 次幂 (x^n)。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2^(-2) = 1/(2^2) = 1/4 = 0.25 注意:

低市值Pow赛道解析,探寻百倍潜力项目

随着铭文的火爆出圈,比特币减半的到来,关于Pow赛道的讨论也在变得火热,不少投资机构都将Pow赛道作为2024年分析的重点。Pow赛道又来已久,不少项目的市值都超过10亿美元,而对于大多数投资者来说,低市值高回报是我们重点埋伏的对象,今天就来盘点那些低市值的Pow项目,探寻超过百倍回报的项目。 1.Dynex Dynexcoin是基于DynexSolve芯片算法的神经形态超级计算区块链,提出有

力扣 50.pow(x,n)

class Solution { public:     double quickMul(double x,long long N){         if(N==0) return 1;         double value=quickMul(x,N/2);         return N%2==0?value*value:value*value*x;     }     d