我在写一个程序来求三维向量的大小。我需要使用一个函数来计算幅值(该程序还计算两个向量的点积,但我现在只处理幅值部分)。程序首先询问用户是否要查找点积或幅度,当用户选择幅度时,它要求为矢量提供3个值。但是,它返回错误的东西。如果我输入1,2,3
作为向量的分量,它会返回292044616
。我认为问题出在我的函数调用上,但我现在确定是什么了。这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void) {
double find_magnitude(double v1, double v2, double v3);
//double theta;
int v1, v2, v3;// w1, w2, w3, mag, dot;
char a;
//dot = (v1 * w1) + (v2 * w2) + (v3 * w3);
printf("Enter M/m or magnitude or D/d for the dot product and angle in degrees: ");
scanf("%c", &a);
if (a == 'M' || a == 'm') {
printf("Enter in values for v1, v2, and v3: ");
scanf("%d,%d,%d", &v1, &v2, &v3);
printf("%d", find_magnitude(v1, v2, v3));
}
return(0);
}
double find_magnitude(double v1, double v2, double v3) {
double mag;
mag = sqrt(pow(v1, 2) + pow(v2, 2) + pow(v3, 2));
return(mag);
}
1条答案
按热度按时间px9o7tmv1#
问题很简单:函数
find_magnitude
返回一个double
,但你告诉printf
将int
转换为%d
。您应该使用%f
说明符:还请注意以下备注:
find_magnitude()
的forward声明应该放在全局范围内以保持一致性。正如声明的那样,定义和声明是独立的,不一致不会在编译时产生诊断,但会在运行时产生未定义的行为。由于这个原因和其他原因,在C中总是在全局范围内编写全局对象的声明被认为是更安全和惯用的。v1
、v2
和v3
可能应该被定义为double
。v1 * v1
是计算v1
的平方比pow(v1, 2)
更简单、更有效的方法。scanf()
的返回值以检测无效或丢失的输入。以下是修改后的版本:
如 Eph 所述,计算3D向量的幅度(或模数)可以使用
<math.h>
中声明的hypot()
函数更准确地执行:v1
、v2
和/或v3
的值非常大、非常小或在幅度上非常不同的情况下,计算sqrt(v1 * v1 + v2 * v2 + v3 * v3)
可能产生不准确的结果。hypot(v1, v2)
应用于2D向量,而不是sqrt(v1 * v1 + v2 * v2)
,hypot(v1, hypot(v2, v3))
用于3D向量。以下是
find_magnitude
的修改版本: