petrov_npa02
Junior Member / Новичок
Участник № / Member № 6640
отправлено / posted
Здравствуйте!
TRACE MODE базовая версия 6.10.1. Пытаюсь сохранить СПАД в таблице БД Access. Все прекрасно записывается, но реальное значение записывается только в "семицифровом" представлении, то есть в 6 цифр и разделитель.
То есть: 1.23456 пишется как 1.23456 11.23456 пишется как 11.2346 1111.231079 пишется как 1111.23 11111.234375 пишется как 11111.2
с целыми числами еще интересней: 123456 пишется как 123456 1234567 пишется как 1234570 12345678 пишется как 12345700
Получается, при попытке записать число разрядностью более 4х знаков, точность снижается до двух знаков после запятой, это при том, что мне требуется, как минимум три знака.
Как лечить?
PS. Профессиональная версия будет приобретена сразу, как только согласуем количество каналов.
Сообщения / Posts 8 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
При перенаправлении СПАД в БД значения всех аналоговых величин передаются в диапазоне стандартного 4-байтового FLOAT. Такие величины корректно отображаются числами с количеством значащих цифр не более 6. Поле в таблице БД должно иметь формат "одиночное FLOAT". Целые числа передаются корректно в диапазоне 4-байтового целого. Формат поля БД должен быть соответствующим.
Сообщения / Posts 17335 | Из / From: Россия
| IP / IP: IP адрес / IP address |
petrov_npa02
Junior Member / Новичок
Участник № / Member № 6640
отправлено / posted
Спасибо за ответ, только я не совсем понял, извините.
Если "значения всех аналоговых величин передаются в диапазоне стандартного 4-байтового FLOAT", то почему теряется разрядность после запятой, при увеличении разрядности целой части?
Почему 1.23456 пишется как 1.23456, 11.23456 пишется как 11.2346, а 1111.231079 пишется как 1111.23? По какой причине уменьшается количество знаков после запятой? Мне нужно не менее трех знаков.
Поле в БД - одиночное FLOAT. Пробовал менять на двойное FLOAT - результат тот же.
отправлено / posted
Надо ознакомиться со стандартом формата FLOAT. Его мантисса содержит 23 бита, причем старший бит всегда равен 1. Поэтому число значащих цифр (суммарно - до и после запятой) не может превышать 6-7. В распространенных версиях стандарта (в зависимости от используемых компиляторов) - 6 значащих цифр.
Сообщения / Posts 17335 | Из / From: Россия
| IP / IP: IP адрес / IP address |
petrov_npa02
Junior Member / Новичок
Участник № / Member № 6640
отправлено / posted
Я знаком со стандартом представления действительных чисел (чисел с плавающей точкой) в двоичном коде.
Это что же получается - при записи данных в положение запятой в числе сдвигается таким образом, чтобы получилось число (из примера в предыдущем посте) 0,111123? И поэтому значение "обрезается"? Если так - то зачем?
Если нет, тогда почему при записи 1111.231079 записывается 1111.23? Где здесь 6 значащих цифр после запятой? Почему округляется до 2-х значащих цифр? Где это написано в стандарте IEEE 754?
Мне необходимо сохранять в БД значение массы продукта в резервуаре с точностью до килограмма, при том, что само значение массы считывается в тоннах. Как мне это реализовать для резервуара объемом 10000 м3?
Сообщения / Posts 8 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Не надо путать диапазон и точность. Диапазон определяется диапазоном "порядка" в представлении числа. Точность определяется диапазоном изменения мантиссы - для одинарного FLOAT 0x7FFFFF = 8388607. Т.о., точность даже теоретически не может дать больше 7 десятичных знаков. На практике, как правило, не более 6. Ограничивается СУММАРНОЕ количество значащих цифр: до и после запятой. Именно поэтому число 1111.231079 округляется до 1111.23.