" title="Написать письмо">Написать письмо

Статистика

Пользователи : 1
Статьи : 2475
Просмотры материалов : 10539992
 
Относительность типов данных (07.09.2026). Печать E-mail
2026 - Сентябрь
07.09.2026 18:31
Save & Share
На сайте несколько раз писалось о том, что Qt - говно. Анализ типов данных показал это ещё раз - но не это главный вывод. При переходе не только на любую другую среду программирования, но и просто на другую версию текущей, - никогда не можешь быть уверен, откуда получишь очередной удар. Потому что даже типы данных у них - одинаковые по названию и при этом разные.


Стоит обратиться к ранее эмпирически выведенным фактам:
- среда программирования Arduino IDE. Int занимает 2 байта и является точной копией short int. Если работать именно с платформой Arduino Nano - float=double=4Б - double ведёт себя как float, с соответствующей точностью;
- среда программирования Qt v.5.3. Функция pow() способна корректно вернуть значение только до 53 степени - далее результат искажается - пришлось писать свою функцию unsigned long long. В Qt v.5.15 данный баг убран. В интернете есть сообщение о том, что какая-то другая среда программирования допускает использование в pow() только до ~22 степени двойки;
- операционная система. В Windows long занимает 4Б (синоним int), в Linux - 8Б (синоним long long). Это привело к хлопку пердака.

Заинтересовался точностью хранения данных в double и long double разных сред программирования. Как начал с Qt - так и закончил: по сравнению с BCB v.6.0 - ни число в переменную засунуть нормально не может (ясно, что нужно подписать ".0", - но это лишние телодвижения, коих в Qt великое множество), ни использовать её в циклах (а это совсем беда: при анализе погрешностей long double только такой тип данных в циклах и использовался в BCB).



Думал использовать функцию pow() для понимания точности хранения данных - и в процессе наткнулся совсем на другое. Во всех нормальных C-подобных языках: переменные с плавающей точкой имеют маленькую погрешность - что порождает проблему их сравнения, например, с целочисленными переменными. Что сделали Qt v.5.15: избавились от этой погрешности при сравнении чисел. Число 264-1 в double и unsigned long long - сравниваются с помощью != корректно. Но убив погрешность при сравнении - они убили и точность сравнения. У double можно отнять любое число до 1024 включительно или прибавить до 2048 включительно - и "равенство" будет упорно соблюдаться. Невозможно убрать то, что существует на физическом уровне при хранении мантиссы в RAM, - в Qt решили тупо это скрыть (как и отмазались при получении времени выполнения исходного кода).


Qt - говно.
Обновлено ( 07.09.2026 20:06 )
 
 

Последние новости


©2008-2026. All Rights Reserved. Разработчик - " title="Сергей Белов">Сергей Белов. Материалы сайта предоставляются по принципу "как есть". Автор не несет никакой ответственности и не гарантирует отсутствие неправильных сведений и ошибок. Вся ответственность за использование материалов лежит полностью на читателях. Размещение материалов данного сайта на иных сайтах запрещено без указания активной ссылки на данный сайт-первоисточник (ГК РФ: ст.1259 п.1 + ст.1274 п.1-3).

Много статей не имеет срока устаревания. Есть смысл смотреть и 2011, и даже 2008 год. Политика сайта: написать статью, а потом обновлять ее много лет.
Рекламодателям! Перестаньте спамить мне на почту с предложениями о размещении рекламы на этом сайте. Я никогда спамером/рекламщиком не был и не буду!
Top.Mail.Ru