一个求n个数的最大值的模板函数,对于float何double,运行结果不同,大家看下~解决方案
一个求n个数的最大值的模板函数,对于float何double,运行结果不同,大家看下~~~
模板代码如下:
template <class T> T maxn(int num, T first, ...)
{
int i = 1;
T tmax = first;
va_list ap;
va_start(ap, first);
while (i++ < num)
{
T tmp = va_arg(ap, T);
if (tmp > tmax)
tmax = tmp;
}
va_end(ap);
return tmax;
}
程序运行结果显示:
maxn(4, 1.23f, 3.21f, 6.22f, 4.33f) = 2.15125;
maxn(4, 1.23, 3.21, 6.22, 4.33) = 6.22;
请问为什么对于第一个maxn(4, 1.23f, 3.21f, 6.22f, 4.33f)结果为什么不是6.22.
谢谢~~~
------解决方案--------------------
很奇怪
关注
------解决方案--------------------
maxn(4f, 1.23f, 3.21f, 6.22f, 4.33f) = 2.15125;
加上 f
------解决方案--------------------
float 作为函数参数默认会转化为 double 的,除非函数的申明处指明了接受 float 型。
你的列子中只有 first 参数才指明了类型,其它是不定类型,被转换成 double 了。
------解决方案--------------------
调试了一下代码,是很奇怪,
T tmp = va_arg(ap, T); 有些值tmp为0.00000
------解决方案--------------------
adlay(www.adintr.com)(无可奈何天) 说的也不完全正确
如果你把first设成float,其他显示声明成double也是一样的结果
我猜想是不是va_start或者va_arg有什么bug
------解决方案--------------------
你还是在调试模式下看汇编吧。
你看看传参数时,压栈多少字节吧。
float在传参时,恐怕强制升级到double了吧。
不要使用不定参数函数,水是比较深的。
------解决方案--------------------
支持adlay(www.adintr.com)(无可奈何天) 的观点!
至于zyx040404() 说的后面声明成double的问题,如果后面声明成double,那么va_arg(ap, T)要变成va_arg(ap, double)了,不然肯定还是相同的结果,你可以试试template <class T> T maxn(int num, T first, T,T,T...),这样就是6.22。
关键的问题,还是压入8字节,读取却只有4字节的引起的。
模板代码如下:
template <class T> T maxn(int num, T first, ...)
{
int i = 1;
T tmax = first;
va_list ap;
va_start(ap, first);
while (i++ < num)
{
T tmp = va_arg(ap, T);
if (tmp > tmax)
tmax = tmp;
}
va_end(ap);
return tmax;
}
程序运行结果显示:
maxn(4, 1.23f, 3.21f, 6.22f, 4.33f) = 2.15125;
maxn(4, 1.23, 3.21, 6.22, 4.33) = 6.22;
请问为什么对于第一个maxn(4, 1.23f, 3.21f, 6.22f, 4.33f)结果为什么不是6.22.
谢谢~~~
------解决方案--------------------
很奇怪
关注
------解决方案--------------------
maxn(4f, 1.23f, 3.21f, 6.22f, 4.33f) = 2.15125;
加上 f
------解决方案--------------------
float 作为函数参数默认会转化为 double 的,除非函数的申明处指明了接受 float 型。
你的列子中只有 first 参数才指明了类型,其它是不定类型,被转换成 double 了。
------解决方案--------------------
调试了一下代码,是很奇怪,
T tmp = va_arg(ap, T); 有些值tmp为0.00000
------解决方案--------------------
adlay(www.adintr.com)(无可奈何天) 说的也不完全正确
如果你把first设成float,其他显示声明成double也是一样的结果
我猜想是不是va_start或者va_arg有什么bug
------解决方案--------------------
你还是在调试模式下看汇编吧。
你看看传参数时,压栈多少字节吧。
float在传参时,恐怕强制升级到double了吧。
不要使用不定参数函数,水是比较深的。
------解决方案--------------------
支持adlay(www.adintr.com)(无可奈何天) 的观点!
至于zyx040404() 说的后面声明成double的问题,如果后面声明成double,那么va_arg(ap, T)要变成va_arg(ap, double)了,不然肯定还是相同的结果,你可以试试template <class T> T maxn(int num, T first, T,T,T...),这样就是6.22。
关键的问题,还是压入8字节,读取却只有4字节的引起的。