Может кто-нибудь сказать мне, почему поплавок не может вместить 3153600000? - PullRequest
3 голосов
/ 28 апреля 2011

Я знаю, что это глупо, но я тихий нуб в мире программирования, вот мой код.

Этот работает отлично:

#include <stdio.h>

int main() {

    float x = 3153600000 ;

    printf("%f", x);

    return 0;
}

Но у этого естьпроблема:

#include <stdio.h>

int main() {

    float x = 60 * 60 * 24 * 365 * 100 ;

    printf("%f", x);

    return 0;
} 

Итак, 60 * 60 * 24 * 365 * 100 - это правильно 3153600000 ???если да, то почему он дал разные результаты ???Я получил переполнение во втором, которое он напечатал "-1141367296.000000" в результате.Кто-нибудь может сказать мне, почему?

Ответы [ 4 ]

9 голосов
/ 28 апреля 2011

Вы умножаете целые числа, а затем помещаете результат в число с плавающей точкой.К этому времени он уже переполнен.

Попробуйте float x = 60.0f * 60.0f * 24.0f * 365.0f * 100.0f;.Вы должны получить желаемый результат.

5 голосов
/ 28 апреля 2011

60 - это целое число, равно как 24, 365 и 100.Поэтому все выражение 60 * 60 * 24 * 365 * 100 выполняется с использованием целочисленной арифметики (компилятор оценивает выражение до того, как видит тип переменной, в которую вы его назначаете).

В типичной 32-разрядной архитектурецелое число со знаком может содержать только значения до 2 147 483 647.Таким образом, значение будет усечено до 32 бит до , и оно будет присвоено вашей переменной float.

Если вы скажете компилятору использовать арифметику с плавающей точкой, например, нажав fна первое значение, чтобы оно плавало, тогда вы получите ожидаемый результат.(Число с плавающей точкой, если int - это число с плавающей точкой, поэтому число с плавающей точкой распространяется на все выражение.) Например:

float x = 60f * 60 * 24 * 365 * 100;
2 голосов
/ 28 апреля 2011

Разве ваш компилятор не выплевывает это предупреждение? Мой делает:

предупреждение: целочисленное переполнение в выражение

Переполнение происходит до того, как все-целочисленное выражение преобразуется в число с плавающей точкой перед сохранением в x. Добавьте .0f ко всем числам в выражении, чтобы они плавали.

1 голос
/ 28 апреля 2011

Если вы умножите два целых числа, результатом также будет целое число.

60 * 60 * 24 * 365 * 100 является целым числом.

Поскольку целые числа могут доходить до 2^31-1 (2147483647), такие значения переполняются и становятся -1141367296, который только затем преобразуется в число с плавающей точкой.

Попробуйте умножить числа с плавающей точкой вместо целых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...