阿杰爱学单片机 发表于 2024-9-15 09:20:07

DebugLab 发表于 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;
}

浦江一水 发表于 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(开根号)估计是不行的, 可试试看....

仅供参考...


阿杰爱学单片机 发表于 2024-9-17 09:21:45

浦江一水 发表于 2024-9-15 21:26
标准pow()函数原型应该是:
double pow(double base, double exponent);
其参数和返回值, 都是 double...

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

浦江一水 发表于 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, 有点不太好理解了...

阿杰爱学单片机 发表于 2024-9-18 07:54:34

浦江一水 发表于 2024-9-17 10:22
根据11#楼的自定义pow()函数来看...
1#楼图示中的第二参数 "Length-i-1" 是带运算的, 是有可能超出所定义 ...

写反了是Result*=X;

阿杰爱学单片机 发表于 2024-9-18 07:55:51

浦江一水 发表于 2024-9-17 10:22
根据11#楼的自定义pow()函数来看...
1#楼图示中的第二参数 "Length-i-1" 是带运算的, 是有可能超出所定义 ...

你的意思是可能超过数据类型所以才报错的吗

阿杰爱学单片机 发表于 2024-9-18 08:02:02

浦江一水 发表于 2024-9-17 10:22
根据11#楼的自定义pow()函数来看...
1#楼图示中的第二参数 "Length-i-1" 是带运算的, 是有可能超出所定义 ...

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

浦江一水 发表于 2024-9-24 09:27:53

阿杰爱学单片机 发表于 2024-9-18 08:02
我加一个中间变量转一下数据就没问题了,但这样很麻烦,要多些好多变量 ...

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

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

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

阿杰爱学单片机 发表于 2024-9-24 22:08:31

浦江一水 发表于 2024-9-24 09:27
复15#楼:
是的, 写反了.可见这段函数代码并没经过实际运行, 否则一跟踪调试, 就会发现错了.



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

health 发表于 2024-9-24 23:20:23

函数定义中参数是uint8_t,而你给它输入的是int型或以上,有警告很正常。
(Length-i-1)这里面length和i是什么类型没有说明,但整个表达式类型最低就是int起步。
如果有任何一个是long型,那么结果也是long型,如果有任何一个是float,那么结果也是float型。
页: 1 [2] 3
查看完整版本: 求助下大佬们