c++ - Arduino Pow() 和 Armstrong 数问题
问题描述
这是我要运行的代码。我尝试了很多事情,比如我找到了一个用 math.h 做 ceil() 的解决方案,但我真的很想了解为什么即使我做了类似的事情也不起作用
pow((int)j, 3) + pow((int)d, 3) + pow((int)s, 3)
其中 j 为 3,d 为 5,s 为 1;如果我在哪里做
pow(3,3) + pow(5,3) + pow(1, 3)
那么这个条件就成立了。
我知道 sum 是 double 类型,并且Serial.println(sum)
说 153.00 我想152.999999
是这样的,但是int j = 3;
与仅 placin 3 有什么不同,pow()
我检查了二进制数据,而 j 实际上是0011
d 是0101
而 s0001
是Serial.println(j, BIN);
int n = 100;
float j, d, s;
double sum;
void setup() {
Serial.begin(9600);
}
void loop() {
delay(100);
if (n >= 100 && n < 154) {
j = n % 10; // 153 % 10 = 3;
d = n / 10 % 10; // 15 % 10 = 5;
s = n / 100; // 153 / 100 = 1;
sum = pow(j, 3) + pow (d, 3) + pow(s, 3);
if (sum == n) {
Serial.println(n);
}
n++;
}
}
如果我在这里发现一些错别字,我会更正自己,我只是在这里输入,而不是复制粘贴:)
解决方案
与仅将 3 放入有何
int j = 3;
不同pow()
pow(int, int)
是与 不同的功能pow(float, float)
。这里的质量显然pow(float, float)
很弱,只能接近数学上正确的答案。C/C++ 没有为这些函数指定所需的接近度。
可以四舍五入pow(float, float)
答案,或者简单地说,对于精确的数学问题,避免浮点数学。
请记住,更好的结果实现可能会以时间性能为代价。你经常得到你付出的代价。
推荐阅读
- ruby-on-rails - 验证子域的格式
- java - “实际参数列表和形式参数列表的长度不同”错误
- azure-sql-database - 如何制作 Azure SQL Exec 或在另一个 Azure SQL 中选择另一个表/过程
- typescript - TypeScript 将通用对象从蛇形转换为驼峰形
- image - Flutter缓存图像是否可以重新加载图像而不是获取缓存图像?
- google-app-engine - google-appengine:找出正在存储的存储桶数据
- postgresql - PostgresSql 安装用户无法登录?
- excel - Excel公式比较日期
- python - 如何在 df.update() + df.reset_index() 之后保持列顺序
- java - 为什么 Java session.getBasicRemote().sendText() 不起作用,但没有错误消息?