我可能是一个愚蠢的事情,但我没有看到,但我的节目中有一个非常奇怪的行为。
这是我的代码
#include <stdio.h>
void spectral_color(double r,double g,double b,double l); //https://stackoverflow.com/a/22681410
int main(int argc, char **argv)
{
double r,g,b;
spectral_color(r,g,b,600);
//printf("%lf,%lf,%lf",r,g,b);
}
void spectral_color(double r,double g,double b,double l) // RGB <0,1> <- lambda l <400,700> [nm]
{
double t; r=0.0; g=0.0; b=0.0;
if ((l>=595.0)&&(l<650.0)) {
t=(l-595.0)/(650.0-595.0);
r=(double)0.98+(0.06*t)-(0.40*t*t);
}
printf("%lf,%lf,%lf",r,g,b);
}
打印0.000000,0.000000,0.000000
,我在gdb
15 t=(l-595.0)/(650.0-595.0);
(gdb) p l
$8 = 600
(gdb) p r
$9 = 1.7802772279180279e-307
(gdb) p t
$10 = 2.4846118548532686e+264
(gdb) n
16 r=(double)0.98+(0.06*t)-(0.40*t*t);
(gdb) p t
$11 = 0.090909090909090912
(gdb) p r
$12 = 1.7802772279180279e-307
(gdb) n
18 printf("%lf,%lf,%lf",r,g,b);
(gdb) p t
$13 = 0.090909090909090912
(gdb) p r
$14 = 1.7802772279180279e-307
在这里,r
没有采取它应该的值,我不知道为什么会这样做。
有人有解释吗?
提前致谢
编辑:
我将r
的值传递给另一个变量,并将%lf
更改为%f
,
结果是r
永远不会等于新变量,但正确的值最终会出现在这个新变量中
double d = r; //this is line 18
printf("%f,%f,%f",d,g,b);
gdb结果:
20 }
(gdb) p d
$1 = 0.98214876033057852
(gdb) p r
$2 = 1.7802772279180279e-307
(gdb)
答案 0 :(得分:-1)
在我阅读manual
之前,我一直困扰这个问题这是l
长度修饰符
(ell) A following integer conversion corresponds to a long int or unsigned long int argument, or a following n conversion corresponds to a pointer to a long int argument, or a following c conversion corresponds to a wint_t argument, or a following s conversion corresponds to a pointer to wchar_t argument.
如果对l
使用double
的长度修饰符,则会执行类型提升或转换。这可能是你混淆的原因。