Неправильный результат сложения при добавлении float и int

У меня довольно необычная проблема, это, вероятно, просто плохой код от новичка C-learn. Я борюсь со следующим фрагментом кода.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv) {
    float a = 1587128832.000000;
    int d = 1587128898.000000;
    float f = a + d ;
    printf("%f\n", f);
    return 0;
}

Следующий код выводит 3174257664.000000, в то время как Google говорит, что результат должен быть 3174257730 .

Я пытаюсь добавить float/double к int, и это дает мне странный результат.

Так что, черт возьми, я делаю неправильно?

Я не думаю, что ошибка на самом деле связана со смешанными типами данных, поскольку C должен преобразовывать ints в floats.


person sijanec    schedule 18.05.2020    source источник
comment
Если float в вашей системе 32-битное, то оно имеет только 6 или максимум 7 значащих десятичных цифр. Ваши инициализаторы имеют гораздо больше, чем 6 или 7 значащих цифр.   -  person phonetagger    schedule 18.05.2020
comment
Том Скотт — числа с плавающей запятой могут вам помочь   -  person Ed Heal    schedule 18.05.2020
comment
@phonetagger Спасибо, после использования double все работает. Должен ли я удалить это или оставить для SEO?   -  person sijanec    schedule 18.05.2020
comment
Если вы используете double, это не должно быть проблемой.   -  person anastaciu    schedule 18.05.2020
comment
По последним подсчетам, этот вопрос или его варианты задавались на SO 115 640 000 раз. Но этот счет мог страдать от ошибки округления.   -  person phonetagger    schedule 18.05.2020


Ответы (1)


float не может хранить именно такие числа.введите здесь описание изображения

а именно https://www.h-schmidt.net/FloatConverter/IEEE754.html

если вам нужен точный результат, вам нужно больше памяти -> используйте double.

person Ecto    schedule 18.05.2020
comment
Вся основная информация ответа должна быть включена в ответ. Связанная информация может исчезнуть или измениться, включая изображения на imgur.com. - person Eric Postpischil; 19.05.2020