IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Форматированный вывод, Не понимаю сути
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Вот запись:
write(a:b:c);
где a - переменная
b,c - выражения тип integer, необязательные параметры, указывающие соответственно ширину выводимого поля и количество дробных цифр.

С a и c всё понятно, а вот b просто заводит меня в тупик, дело в том, что если b имеет значение 1, то до дробной части можно писать ещё порядка 15 знаков, но ведь b должно в этом меня ограничивать, так? А этого не происходит. Почему? Заранее спасибо за ответ на тупой вопрос. unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Твоя программа просто не будет выводить ни в каком виде. Она просто напросто не откомпилируется. Можешь проверить... Во-первых, ты забыл слово Var, во-вторых, в целое (Integer) число НЕЛЬЗЯ заносить вещественное значение, ну и в третьих, число типа Integer способно принимать значения от -32768 до 32767

Так что вопрос остался открытым: как именно затирается дробная часть.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Цитата(volvo @ 9.04.2006 5:35) *

Твоя программа просто не будет выводить ни в каком виде. Она просто напросто не откомпилируется. Можешь проверить... Во-первых, ты забыл слово Var, во-вторых, в целое (Integer) число НЕЛЬЗЯ заносить вещественное значение, ну и в третьих, число типа Integer способно принимать значения от -32768 до 32767

Так что вопрос остался открытым: как именно затирается дробная часть.

Сейчас всё починил. Ну новичок я. Что с меня взять? rolleyes.gif Теперь нормально? Дробная часть становится равной нулю, примерно такой вид: 12345678901000000000.00. Понятно?

Сообщение отредактировано: MeatCrash -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(MeatCrash @ 9.04.2006 2:56)
Сейчас всё починил. Ну новичок я. Что с меня взять? rolleyes.gif Теперь нормально? Дробная часть становится равной нулю, примерно такой вид: 12345678901000000000.00. Понятно?

Продолжаем краткую экскурсию в систему типов языка:
Здесь проблема совершенно не в том, сколько чисел ТЫ разрешил печатать при выводе. Проблема вот в чем. Любое вещественное число в памяти компьютера представляется в виде мантиссы (нормализованной) и экспоненты, то есть число 12345.6 будет храниться в виде 1.23456 * 10^4

Так вот, о проблеме - у переменных типа Real точность мантиссы ограничена 11 - 12 знаками, то есть все цифры, начиная с 12 от десятичной точки просто напросто теряются... Теперь более понятно, что происходит? Вот твой же пример:
12345678901234567890.345
нормализуем мантиссу и приводим число к экспоненциальному виду, как оно хранится в памяти:
1.2345678901234567890345 * 10^19 (можешь в этом убедиться в окне Watches)
теперь "теряем точность" - оставляем только первые 11 цифр после запятой:
1.2345678901200000000000 * 10^19

И вот это число ты печатаешь... А при печати с указанием ширины поля вывода кроме всего прочего происходит еще и округление. Что имеем? Число опять преобразуется из экспоненциальной в обычную форму, округляется по правилам математики до того количества цифр после запятой, что ты указал вторым параметром, и распечатывается:
12345678901200000000.00 (после запятой ставится столько цифр, сколько ты просил, а перед запятой программа ничего менять не имеет права, если заданное тобой первое поле БОЛЬШЕ чем есть цифр перед запятой, то как написал klem4, перед числом будут добавлены пробелы. Если же ты указал первое поле МЕНЬШЕ, чем есть цифр перед запятой, то число выведется полностью, но пробелы перед ним ставиться не будут)...

Теперь понятно, откуда это берется? Кстати, это не самая простая тема для начинающего... no1.gif Могу только добавить, что чуть-чуть поправить ситуацию можно, если использовать более емкие сопроцессорные типы: Double (15-16 значащих цифр) и Extended (19-20 значащих цифр). Но все равно, их точность тоже не безгранична, и даже 20 цифр - не так много...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
MeatCrash   Форматированный вывод   8.04.2006 8:38
klem4   Вот тебе пример программы, надеюсь он поможет тебе…   8.04.2006 12:50
hydroxychloroquine zinc and zith   Healthy Male Internet   23.09.2021 15:47
MeatCrash   Спасибо! Уже начинает доходить... :lol: Про п…   9.04.2006 5:32
volvo   Интересен сам факт того, что даже если эту 1-цу ос…   9.04.2006 5:52
MeatCrash   И не зачем так кричать... Program Simply_plane; Va…   9.04.2006 6:29
volvo   Твоя программа просто не будет выводить ни в каком…   9.04.2006 6:35
MeatCrash   Твоя программа просто не будет выводить ни в како…   9.04.2006 6:56
volvo   Сейчас всё починил. Ну новичок я. Что с меня взять…   9.04.2006 7:43
MeatCrash   Теперь понятно, откуда это берется? Кстати, это не…   9.04.2006 8:10
azithromycin over the counter ca   cialis non prescription   19.12.2021 0:01
APAL   А может MeatCrash в бан? :mad: Нарушение прави…   9.04.2006 7:51
volvo   Последнее предложение означает: "не удивляйся…   9.04.2006 12:15
gabapentin side effects weight g   natural viagra cialis   10.10.2021 15:20
MeatCrash   Судя по моим знаниям их ещё будет немало. :)   10.04.2006 7:39


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 8:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name