找回密码
 立即注册

求助下大佬们

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

积分
421
发表于 2024-9-15 09:20:07 | 显示全部楼层
Debu*** 发表于 2024-9-10 14:51
看看pow在math.h里怎么定义的,数据类型匹配不匹配

匹配 的吧
uint32_t pow( uint8_t x, uint8_t y )
{
    uint32_t Result = 1;
    while( y-- )
    {
        x *= Result;
    }
    return Result;
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:536
  • 最近打卡:2025-06-16 08:31:26

31

主题

351

回帖

3789

积分

荣誉版主

积分
3789
发表于 2024-9-15 21:26:18 | 显示全部楼层
本帖最后由 浦江一水 于 2024-9-16 08:36 编辑
阿杰爱*** 发表于 2024-9-15 09:20
匹配 的吧
uint32_t pow( uint8_t x, uint8_t y )
{

标准pow()函数原型应该是:
  double pow(double base, double exponent);
其参数和返回值, 都是 double 数据类型(双精度浮点数,占8字节).


如果是自定义函数(不使用math中的标准函数)的话,编译是可以通过的,但是使用时就要注意其局限性了.
因为参数x,y都是无符号的短整型数,取值范围是0...255,所以参数中如果带运算(如1#楼贴图所示),大概率是被警告要被截断的.
另外,若用此自定义函数, 计算 4^2=16 是可以的, 而计算 4^0.5=2(开根号)估计是不行的, 可试试看....

仅供参考...


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

积分
421
发表于 2024-9-17 09:21:45 | 显示全部楼层
浦江*** 发表于 2024-9-15 21:26
标准pow()函数原型应该是:
  double pow(double base, double exponent);
其参数和返回值, 都是 double  ...

但是我计算的也没有小数啊,就是一个循环,计算出10的几次方按理来说装得下的,难道说这个函数参数得是有符号的吗,主要是51单片机没报错,搬过来就错了,奇了怪
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:536
  • 最近打卡:2025-06-16 08:31:26

31

主题

351

回帖

3789

积分

荣誉版主

积分
3789
发表于 2024-9-17 10:22:27 | 显示全部楼层
阿杰爱*** 发表于 2024-9-17 09:21
但是我计算的也没有小数啊,就是一个循环,计算出10的几次方按理来说装得下的,难道说这个函数参数得是有 ...

根据11#楼的自定义pow()函数来看...
1#楼图示中的第二参数 "Length-i-1" 是带运算的, 是有可能超出所定义的 uint8_t 数据类型的.所以有警告...
若C51不报错, 而C251就报错. 这是因为编译器版本不同, 对语法检查的严格程度也不同.

另外再仔细看,  11#楼函数中,
  Result=1;        //初值赋1
  x *= Result;    //也就是x = x*1;
循环了y次, Result这个变量好像没有变化, 最后返回的是Result, 有点不太好理解了...
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

积分
421
发表于 2024-9-18 07:54:34 | 显示全部楼层
浦江*** 发表于 2024-9-17 10:22
根据11#楼的自定义pow()函数来看...
1#楼图示中的第二参数 "Length-i-1" 是带运算的, 是有可能超出所定义 ...

写反了是Result*=X;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

积分
421
发表于 2024-9-18 07:55:51 | 显示全部楼层
浦江*** 发表于 2024-9-17 10:22
根据11#楼的自定义pow()函数来看...
1#楼图示中的第二参数 "Length-i-1" 是带运算的, 是有可能超出所定义 ...

你的意思是可能超过数据类型所以才报错的吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

积分
421
发表于 2024-9-18 08:02:02 | 显示全部楼层
浦江*** 发表于 2024-9-17 10:22
根据11#楼的自定义pow()函数来看...
1#楼图示中的第二参数 "Length-i-1" 是带运算的, 是有可能超出所定义 ...

我加一个中间变量转一下数据就没问题了,但这样很麻烦,要多些好多变量
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:536
  • 最近打卡:2025-06-16 08:31:26

31

主题

351

回帖

3789

积分

荣誉版主

积分
3789
发表于 2024-9-24 09:27:53 | 显示全部楼层
阿杰爱*** 发表于 2024-9-18 08:02
我加一个中间变量转一下数据就没问题了,但这样很麻烦,要多些好多变量 ...

复15#楼:
  是的, 写反了.  可见这段函数代码并没经过实际运行, 否则一跟踪调试, 就会发现错了.

复16#楼:
  是的, 只要有可能超越, 就会有警告... 这个C251编译器就是这样...

复17#楼:
  不是必须加中间变量的, 可以把参数算式括弧起来,前面再加类型转换即可.
  比如, 第二参数写成:   (uint8_t)(Length-i-1)
  (这是根据11#楼所给出的自定义函数而言的, 标准pow函数不是这样的)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

积分
421
发表于 2024-9-24 22:08:31 | 显示全部楼层
浦江*** 发表于 2024-9-24 09:27
复15#楼:
  是的, 写反了.  可见这段函数代码并没经过实际运行, 否则一跟踪调试, 就会发现错了.

是我回答的时候写反了,真正代码没反
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-01 23:18:33

15

主题

139

回帖

1045

积分

金牌会员

积分
1045
发表于 2024-9-24 23:20:23 | 显示全部楼层
函数定义中参数是uint8_t,而你给它输入的是int型或以上,有警告很正常。
(Length-i-1)这里面length和i是什么类型没有说明,但整个表达式类型最低就是int起步。
如果有任何一个是long型,那么结果也是long型,如果有任何一个是float,那么结果也是float型。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 07:04 , Processed in 0.214964 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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