Евклидова норма векторной функции не работает должным образом из-за изменения типа данных - PullRequest
0 голосов
/ 07 мая 2020

Nb Приведенный ниже код не используется намеренно

В приведенном ниже коде я успешно вычисляю евклидову норму вектора.

#include <stdio.h>

int scanning_vector(int *vector);
int printing_vector(int *vector);
float euclidean_norm(int *vector);

int main()
{

    int vector1[5], vector2[5];
    float solution;

    printf("Please enter the first vector:\n");

    scanning_vector(vector1);
    printing_vector(vector1);
    solution=euclidean_norm(vector1);
    printf("%f",solution);


    printf("\nPlease enter the second vector:\n");

    scanning_vector(vector2);
    printing_vector(vector2);

    return 0;
}

int scanning_vector(int *vector)
{
    int i;
    for (i = 0; i < 5; ++i)
    {
        scanf("%d", &vector[i]);
    }
    return 0;   
}

int printing_vector(int *vector)
{
    int i;
    for (i = 0; i < 5; ++i)
    {
        printf(" %d ", vector[i]);
    }
    return 0;
}

float euclidean_norm(int *vector)
{
    int i;
    float temp, sqrt, euclidean_norm;
    temp = 0;

    for (i = 0; i < 5; ++i)
    {
        euclidean_norm=euclidean_norm+vector[i]*vector[i];
    }
    /* The below code is to calculate the square root without using math.h */
    sqrt = euclidean_norm / 2;

    while(sqrt != temp)
    {
        temp = sqrt;
        sqrt = (euclidean_norm/temp + temp) / 2;
    }
    return sqrt;
}

Однако я не понимаете, почему приведенный ниже код не работает. Я только изменил в функции euclidean_norm тип данных параметра euclidean_norm с float на integer. Не могли бы вы дать мне быстрое объяснение, почему это не работает? Спасибо!

#include <stdio.h>

int scanning_vector(int *vector);
int printing_vector(int *vector);
float euclidean_norm(int *vector);

int main()
{

    int vector1[5], vector2[5];
    float solution;

    printf("Please enter the first vector:\n");

    scanning_vector(vector1);
    printing_vector(vector1);
    solution=euclidean_norm(vector1);
    printf("%f",solution);


    printf("\nPlease enter the second vector:\n");

    scanning_vector(vector2);
    printing_vector(vector2);

    return 0;
}

int scanning_vector(int *vector)
{
    int i;
    for (i = 0; i < 5; ++i)
    {
        scanf("%d", &vector[i]);
    }
    return 0;   
}

int printing_vector(int *vector)
{
    int i;
    for (i = 0; i < 5; ++i)
    {
        printf(" %d ", vector[i]);
    }
    return 0;
}

float euclidean_norm(int *vector)
{
    int i, euclidean_norm;
    float temp, sqrt;
    temp = 0;

    for (i = 0; i < 5; ++i)
    {
        euclidean_norm=euclidean_norm+vector[i]*vector[i];
    }
    /* The below code is to calculate the square root without using math.h */
    sqrt = euclidean_norm / 2;

    while(sqrt != temp)
    {
        temp = sqrt;
        sqrt = (euclidean_norm/temp + temp) / 2;
    }
    return sqrt;
}

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вы вызвали неопределенное поведение , используя значение неинициализированной переменной, имеющей автоматическую c продолжительность хранения euclidean_norm, которая не определена. Инициализируйте это перед вводом l oop.

После этого строка sqrt = euclidean_norm / 2; должна быть sqrt = euclidean_norm / 2.0f;, чтобы избежать усечения результата до целого числа.

0 голосов
/ 07 мая 2020

Спасибо @MikeCAT за быстрый ответ! Просто оставьте здесь код, который работает при использовании типа данных параметра euclidean_norm как целого числа. Спасибо!

#include <stdio.h>

int scanning_vector(int *vector);
int printing_vector(int *vector);
float euclidean_norm(int *vector);

int main()
{

    int vector1[5], vector2[5];
    float solution;

    printf("Please enter the first vector:\n");

    scanning_vector(vector1);
    printing_vector(vector1);
    solution=euclidean_norm(vector1);
    printf("%f",solution);


    printf("\nPlease enter the second vector:\n");

    scanning_vector(vector2);
    printing_vector(vector2);

    return 0;
}

int scanning_vector(int *vector)
{
    int i;
    for (i = 0; i < 5; ++i)
    {
        scanf("%d", &vector[i]);
    }
    return 0;   
}

int printing_vector(int *vector)
{
    int i;
    for (i = 0; i < 5; ++i)
    {
        printf(" %d ", vector[i]);
    }
    return 0;
}

float euclidean_norm(int *vector)
{
    int i, euclidean_norm=0;
    float temp, sqrt;
    temp = 0;

    for (i = 0; i < 5; ++i)
    {
        euclidean_norm=euclidean_norm+vector[i]*vector[i];
    }
    /* The below code is to calculate the square root without using math.h */
    sqrt = euclidean_norm / 2;

    while(sqrt != temp)
    {
        temp = sqrt;
        sqrt = (euclidean_norm/temp + temp) / 2;
    }
    return sqrt;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...