Модератор: Модераторы разделов
newsrc
Сообщения: 314
ОС: Slackware
Сообщение
newsrc » 10.09.2012 14:56
Число
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;
}
Компиляция:
Результат:
Код: Выделить всё
$ ./test
123456792
170141183460469231731687303715884105728
170141183460469231731687303715884105728
1701411796575174310469990992257744896
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Фантом
Сообщения: 457
ОС: openSUSE
Сообщение
Фантом » 10.09.2012 16:00
Потому что далеко не все числа до максимально допустимого представимы. Что неудивительно - как Вы собрались запихивать такую точность в четыре байта?
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)
Сообщение
Voral » 10.09.2012 16:13
Тип флоат это такая засада...... Что лучше подумать об использовании других типов.... имхо
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
newsrc
Сообщения: 314
ОС: Slackware
Сообщение
newsrc » 10.09.2012 16:24
Согласен, конечно, что 32 бит для этого не хватит.
Тогда почему
не умещается?
Но
умещается.
K&R пишут, что
Число типа float обычно представляется 32-битовой переменной, содержащей как минимум 6 значащих цифр и имеющей диапазон значений от 10^(-38) до 10^(+38).
В первом случае девять значащих цифр, во втором 8. Т.е. мой максимум -- 8?
И ещё, как же хранится тогда 10^(+32)?
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)
Сообщение
Voral » 10.09.2012 17:03
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
Сообщение
newsrc » 10.09.2012 17:08
Voral писал(а): ↑ 10.09.2012 17:03
А вообще, какая у вас глобальная задача.
Задача -- разобраться наконец-то с этой темой.
Поставленную задачу можно решить и через строку и разделение этой строки на части.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)
Сообщение
Voral » 10.09.2012 17:32
Чего то достойной стаетйки не попалось. Общая суть это тип для больших чисел, но при отсутствии необходимости в большой точности.
Об этом упоминается, имхо, во всех букварях программирования (где рассказано чуть больше чем просто "существует такой тип"). Если используете этот тип, то в программе должно быть понятие и погрешности.
Почитайте, например,
Тут
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
newsrc
Сообщения: 314
ОС: Slackware
Сообщение
newsrc » 10.09.2012 17:50
Буду разбираться, спасибо.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Фантом
Сообщения: 457
ОС: openSUSE
Сообщение
Фантом » 10.09.2012 20:55
newsrc писал(а): ↑ 10.09.2012 16:24
В первом случае девять значащих цифр, во втором 8. Т.е. мой максимум -- 8?
Да. Причем не на всяких числах он будет достигаться, может получиться и 7, и 6.
newsrc писал(а): ↑ 10.09.2012 16:24
И ещё, как же хранится тогда 10^(+32)?
Мантисса числа и его порядок хранятся отдельно. Соответственно, у какого-нибудь числа 1.234E+17 только четыре значащих цифры, а не семнадцать.