函数,返回c中三维向量的大小

mrwjdhj3  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(104)

我在写一个程序来求三维向量的大小。我需要使用一个函数来计算幅值(该程序还计算两个向量的点积,但我现在只处理幅值部分)。程序首先询问用户是否要查找点积或幅度,当用户选择幅度时,它要求为矢量提供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);
}
px9o7tmv

px9o7tmv1#

问题很简单:函数find_magnitude返回一个double,但你告诉printfint转换为%d。您应该使用%f说明符:

printf("%f\n", find_magnitude(v1, v2, v3));

还请注意以下备注:

  • find_magnitude()的forward声明应该放在全局范围内以保持一致性。正如声明的那样,定义和声明是独立的,不一致不会在编译时产生诊断,但会在运行时产生未定义的行为。由于这个原因和其他原因,在C中总是在全局范围内编写全局对象的声明被认为是更安全和惯用的。
  • 变量v1v2v3可能应该被定义为double
  • v1 * v1是计算v1的平方比pow(v1, 2)更简单、更有效的方法。
  • 应该测试scanf()的返回值以检测无效或丢失的输入。

以下是修改后的版本:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

double find_magnitude(double v1, double v2, double v3);

int main(void) {
    double v1, v2, v3;
    char a;

    printf("Enter M/m or magnitude or D/d for the dot product and angle in degrees: ");
    if (scanf("%c", &a) != 1)
        return 1;

    if (a == 'M' || a == 'm') {
        printf("Enter in values for v1, v2, and v3: ");
        if (scanf("%lf,%lf,%lf", &v1, &v2, &v3) == 3) {
            printf("magnitude: %f\n", find_magnitude(v1, v2, v3));
        } else {
            printf("invalid input\n");
        }
    }

    return 0;
}

double find_magnitude(double v1, double v2, double v3) {
    double mag;
    mag = sqrt(v1 * v1 + v2 * v2 + v3 * v3);
    return mag;
}

Eph 所述,计算3D向量的幅度(或模数)可以使用<math.h>中声明的hypot()函数更准确地执行:

  • v1v2和/或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的修改版本:

double find_magnitude(double v1, double v2, double v3) {
    return hypot(v1, hypot(v2, v3));
}

相关问题