Странный вывод типа float

Модератор: Модераторы разделов

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Странный вывод типа float

Сообщение newsrc »

Число b максимум для типа float. Тогда почему меньшее число выводится не корректно?

Файл test.c

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    float a = 123456789.0;
    float b = 170141183460469231731687303715884105728.0;
    float c = 170141183460469231731687303715884105728.0 + 1.0;
    float d = 1701411834604692317316873037158841057.0;

    printf("%.0f\n", a);
    printf("%.0f\n", b);
    printf("%.0f\n", c);
    printf("%.0f\n", d);

    return EXIT_SUCCESS;
}


Компиляция:

Код: Выделить всё

$ gcc -o test ./test.c


Результат:

Код: Выделить всё

$ ./test
123456792
170141183460469231731687303715884105728
170141183460469231731687303715884105728
1701411796575174310469990992257744896

Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 457
ОС: openSUSE

Re: Странный вывод типа float

Сообщение Фантом »

Потому что далеко не все числа до максимально допустимого представимы. Что неудивительно - как Вы собрались запихивать такую точность в четыре байта?
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Странный вывод типа float

Сообщение Voral »

Тип флоат это такая засада...... Что лучше подумать об использовании других типов.... имхо
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Странный вывод типа float

Сообщение newsrc »

Согласен, конечно, что 32 бит для этого не хватит.

Тогда почему

Код: Выделить всё

float a = 123456789.0
не умещается?
Но

Код: Выделить всё

float a = 12345678.0
умещается.

K&R пишут, что
Число типа float обычно представляется 32-битовой переменной, содержащей как минимум 6 значащих цифр и имеющей диапазон значений от 10^(-38) до 10^(+38).

В первом случае девять значащих цифр, во втором 8. Т.е. мой максимум -- 8?
И ещё, как же хранится тогда 10^(+32)?
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Странный вывод типа float

Сообщение Voral »

newsrc писал(а):
10.09.2012 16:24
И ещё, как же хранится тогда 10^(+32)?


А вообще, какая у вас глобальная задача.

Можно написть/найти готовый класс для работы с большими числами..... Например, кстати, в книге Аммерааль Л. STL для программистов на C++ есть пример работы.......

ЗЫ Мне с такими числами работать не приходилось, хотя приходилось натыкаться на грабли double. Но там по задаче можно было обойтись либо строкой либо другим типом (BIGINT в Firebird).
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Странный вывод типа float

Сообщение newsrc »

Voral писал(а):
10.09.2012 17:03
А вообще, какая у вас глобальная задача.

Задача -- разобраться наконец-то с этой темой.
Поставленную задачу можно решить и через строку и разделение этой строки на части.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Странный вывод типа float

Сообщение bormant »

newsrc писал(а):
10.09.2012 17:08
Задача -- разобраться наконец-то с этой темой.

http://www.softelectro.ru/ieee754.html
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Странный вывод типа float

Сообщение Voral »

Чего то достойной стаетйки не попалось. Общая суть это тип для больших чисел, но при отсутствии необходимости в большой точности.
Об этом упоминается, имхо, во всех букварях программирования (где рассказано чуть больше чем просто "существует такой тип"). Если используете этот тип, то в программе должно быть понятие и погрешности.

Почитайте, например, Тут
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Странный вывод типа float

Сообщение newsrc »

Буду разбираться, спасибо.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 457
ОС: openSUSE

Re: Странный вывод типа float

Сообщение Фантом »

newsrc писал(а):
10.09.2012 16:24
В первом случае девять значащих цифр, во втором 8. Т.е. мой максимум -- 8?

Да. Причем не на всяких числах он будет достигаться, может получиться и 7, и 6.

newsrc писал(а):
10.09.2012 16:24
И ещё, как же хранится тогда 10^(+32)?


Мантисса числа и его порядок хранятся отдельно. Соответственно, у какого-нибудь числа 1.234E+17 только четыре значащих цифры, а не семнадцать.
Спасибо сказали: