当我使用 `float` 而不是 `double` 时,为什么 `sqrt()` 会打印所需的输出?
Why does the `sqrt()` print the desired output when I use `float`s instead of `double`s?
#include <stdio.h>
#include <math.h>
double hypotenuse( double side1, double side2 );
int main( void )
{
double a, b;
printf( "Enter the values of the two sides: " );
scanf( "%f %f", &a, &b );
printf( "\nThe length of hypotenuse is: %f", hypotenuse( a, b ) );
getchar();
getchar();
return 0;
}
double hypotenuse( double side1, double side2 )
{
double c;
c = (side1 * side1) + (side2 * side2);
return sqrt( c );
}
当我使用 float a, b;
而不是 double a,b;
时,上述程序有效。为什么?
在您的代码中,您使用
scanf( "%f %f", &a, &b );
但是 %f
用于 float
,而不是 double
。尝试 %lf
获得 double
.
对于 scanf()
,说明符 "%f"
需要一个 float *
参数,而不是 double *
。
double a;
// v--- &a is type double *, scanf("%f" expects float *
scanf( "%f", &a );
要在 double
中扫描,请使用需要 double *
参数的说明符 "%lf"
。
double a;
// v--- &a is type double *
scanf( "%lf", &a );
详细信息:scanf()
的参数是 地址 ,其中 scanf()
可以存储结果。 float *
与 double *
不同。
对于 printf()
,数字参数是要打印的 值。由于 printf()
采用可变数量的参数,因此它们会经历 通常的 提升,例如 float
到 double
。因此 printf("%f", some_float)
和 printf("%f", some_double)
可以使用相同的格式说明符。 通常的 促销不适用于 &a
、&b
和 scanf()
,因为这些参数是指针(地址),而不是算术值。
注意:检查 scanf()
结果总是好的。 "%lf"
和 "%lf"
之间的 space 不需要,因为 "%lf"
本身消耗前导白色-space,但它通常在视觉上更容易理解。
if (2 != scanf( "%lf%lf", &a, &b )) Handle_Error();
#include <stdio.h>
#include <math.h>
double hypotenuse( double side1, double side2 );
int main( void )
{
double a, b;
printf( "Enter the values of the two sides: " );
scanf( "%f %f", &a, &b );
printf( "\nThe length of hypotenuse is: %f", hypotenuse( a, b ) );
getchar();
getchar();
return 0;
}
double hypotenuse( double side1, double side2 )
{
double c;
c = (side1 * side1) + (side2 * side2);
return sqrt( c );
}
当我使用 float a, b;
而不是 double a,b;
时,上述程序有效。为什么?
在您的代码中,您使用
scanf( "%f %f", &a, &b );
但是 %f
用于 float
,而不是 double
。尝试 %lf
获得 double
.
对于 scanf()
,说明符 "%f"
需要一个 float *
参数,而不是 double *
。
double a;
// v--- &a is type double *, scanf("%f" expects float *
scanf( "%f", &a );
要在 double
中扫描,请使用需要 double *
参数的说明符 "%lf"
。
double a;
// v--- &a is type double *
scanf( "%lf", &a );
详细信息:scanf()
的参数是 地址 ,其中 scanf()
可以存储结果。 float *
与 double *
不同。
对于 printf()
,数字参数是要打印的 值。由于 printf()
采用可变数量的参数,因此它们会经历 通常的 提升,例如 float
到 double
。因此 printf("%f", some_float)
和 printf("%f", some_double)
可以使用相同的格式说明符。 通常的 促销不适用于 &a
、&b
和 scanf()
,因为这些参数是指针(地址),而不是算术值。
注意:检查 scanf()
结果总是好的。 "%lf"
和 "%lf"
之间的 space 不需要,因为 "%lf"
本身消耗前导白色-space,但它通常在视觉上更容易理解。
if (2 != scanf( "%lf%lf", &a, &b )) Handle_Error();