-
- Кстати, есть еще интересный вопрос на тему преобразований из
плавучки в целочисленную арифметику. Как происходит/не происходит
округление? Что говорит стандарт? Тоже ундефинед бехавиор? il-2(151 знак., 27.02.2026 16:23)
- По поводу +0.5f: есть такая функция lroundf(). - SciFi(27.02.2026 16:28, +1)
- Это в коде. А если тебе надо вычислить некую целочисленную
константу, и там в выражении используется плавучка. Хочется при
этом правильно округлить, чтобы было поточнее. il-2(118 знак., 27.02.2026 18:32)
- имхо, пример некорректен. делитель, пусть дажэ из 0,1% резисторов, для 16р даст заметную неопределённость. Кроме того, у АЦП можэт быть разного типа нелинейности-смещения. И от экземпляра к экземпляру это будет плавать туды-сюды. Чо тут можэт дать плавучка, ХЗ. чем хужэ обычная целочисленка? Я этой радости наелся в своё время и щас тупо такое значеение выстанавливаю при калибровке. Если оно того стоит, канэшн. mse homjak(31 знак., 01.03.2026 22:49)
- не вижу сложности, я делаю так int i=(int)(3.14*100 + 0.49999999999999); - IBAH(01.03.2026 22:38)
- Ну я и пишу в коэффициентах: Nikolay_Po(1918 знак., 27.02.2026 20:58)
- Вот поэтому и уточнял. Вы же давний абориген Сахары, некоторое представление о вашем уровне есть. Целые/плавучка и рантайм/компиляция со временем на автомате уже отслеживаешь. Да и плавучка - посчитать при инициализации разово или постоянно пересчитать - совсем не одно ито же. И так попасться?.. Был удивлён. (усталость, недосып, похмелье?) - Dingo(02.03.2026 07:00)
- - "В современных GCC (сейчас у меня в ходу 12..15 версии, проблески 16й от Клёна) такой дефайн, если собран из статических значений (которые, по цепочке, ясны при проходе препроцессора), компилируется в присвоение константы в нужном месте." - не, мне такой подход категорически не нравится. А если "не шмогла" (GCC не той системы, или вообще не GCC) - значит вместо константы будет минимум вызов функции... - il-2(01.03.2026 15:39)
- Думаю, в этой ситуации ловить последнюю единичку не нужно. - SciFi(27.02.2026 18:36)
- Да. Раньше я писал +0.5. Но когда компиляторы научились выкидывать статические вычисления, стал пользоваться lroundf() или llround(). - Nikolay_Po(27.02.2026 16:29)
- Это в коде. А если тебе надо вычислить некую целочисленную
константу, и там в выражении используется плавучка. Хочется при
этом правильно округлить, чтобы было поточнее. il-2(118 знак., 27.02.2026 18:32)
- По поводу +0.5f: есть такая функция lroundf(). - SciFi(27.02.2026 16:28, +1)
- Уточню то, что не даёт покоя: SystemClockSpeed - динамическая
величина? Если даже так, вряд ли она произвольные значения
принимает. Понимаю, что ситуация уже решена; я ход мыслей при
написании кода понять затрудняюсь. И даже так, как у вас "правильно
было так" - странно: Dingo(465 знак., 27.02.2026 07:36)
- Тактовая задефайнена цифрой в плавающей точке. - Nikolay_Po(27.02.2026 10:45)
- присоединяюсь к VladislavS. Vit(15 знак., 28.02.2026 12:19)
- Как хлорошо, что у нас свобода. Хотя бы в этом смысле. - Nikolay_Po(28.02.2026 12:27)
- о суперспособностях конкретно взятого препроцессора и компилера уже
поговорили. но закладывать потенциальную погрешность там, где её
изначально нет... в проектах приходится манипулировать тактовой, но
такой свободы - в плане вполне ожидаемых соплей по вычислениям -
даже не интересовало применить - Vit(28.02.2026 12:45, +1)
- YMMV. За всю историю такого применения плавучки, у меня такая
проблема возникла в первый раз, и то лишь потому, что не глядел в
предупреждения совсем. Nikolay_Po(87 знак., 01.03.2026 10:04)
- разные вопросы. я о самом использовании дабла для де-факто целого.
у вас же в этом случае - скажем, случилось небрежное обращение с
преобразованиями типов, и ожидание несвойственного поведения. - Vit(01.03.2026 10:46)
- Ни в том, ни в другом аспекте с Вами не согласен, считаю, что
сделал всё правильно. Поделился наблюдением. - Nikolay_Po(01.03.2026 20:25)
- ...с обоими(С):) - Vit(02.03.2026 09:28)
- Ни в том, ни в другом аспекте с Вами не согласен, считаю, что
сделал всё правильно. Поделился наблюдением. - Nikolay_Po(01.03.2026 20:25)
- разные вопросы. я о самом использовании дабла для де-факто целого.
у вас же в этом случае - скажем, случилось небрежное обращение с
преобразованиями типов, и ожидание несвойственного поведения. - Vit(01.03.2026 10:46)
- YMMV. За всю историю такого применения плавучки, у меня такая
проблема возникла в первый раз, и то лишь потому, что не глядел в
предупреждения совсем. Nikolay_Po(87 знак., 01.03.2026 10:04)
- о суперспособностях конкретно взятого препроцессора и компилера уже
поговорили. но закладывать потенциальную погрешность там, где её
изначально нет... в проектах приходится манипулировать тактовой, но
такой свободы - в плане вполне ожидаемых соплей по вычислениям -
даже не интересовало применить - Vit(28.02.2026 12:45, +1)
- Как хлорошо, что у нас свобода. Хотя бы в этом смысле. - Nikolay_Po(28.02.2026 12:27)
- присоединяюсь к VladislavS. Vit(15 знак., 28.02.2026 12:19)
- Тактовая задефайнена цифрой в плавающей точке. - Nikolay_Po(27.02.2026 10:45)
- про насыщение ни где не сказано, а сказано: "результат не
определен" IBAH(1 знак., 26.02.2026 20:50, ссылка)
- Ну вот, а у меня с GCC12 оказалось - насыщение на UINT32_MAX. - Nikolay_Po(26.02.2026 22:58)
- За любое упоминание плавучки без особой на то необходимости
пожизненный эцих с гвоздями! :))) - VladislavS.(24.02.2026 09:24, +1)
- Та ну! С удовольствием использую везде, где нужно определить
константы. Не всё удобно и просто считать целыми. Поэтому не
парюсь, в расчёте на то, что препроцессор посчитает и преобразует в
целое. Тут промахнулся. - Nikolay_Po(24.02.2026 09:41)
- Так вот кто в ПКАДе ввёл плавучие координаты вместо целых, и оттого тот стал уёбищным! - Kpoк(26.02.2026 20:44)
- Тама есть два мелких нюанса: 1) препроцессор не умеет в плавучку 2)
не все компиляторы умеют constant folding с плавучкой. ==>
Можете к копеечному коду внезапно получить внагрузку дабловую
арифметику. - LightElf(26.02.2026 18:45, +1)
- У меня в "боевых" проектах, включено предупреждение. Как только вылазит дабловая - сразу ошибка - недоглядел! Срабатывает - проблем нет. - Nikolay_Po(26.02.2026 23:23)
- "Не все компиляторы" - это так себе аргумент. Если всегда
ориентироваться на самый убогий компилятор, то зачем так жить? - SciFi(26.02.2026 19:23)
- Компилятор не обязан это уметь. И добавлю третий нюанс: результат
"плавучих" операций, вычисленный компилятором, может отличаться от
результата, полученного в рантайме. - LightElf(26.02.2026 19:50)
- Там, где требуется ТАКАЯ точность, я считаю в целых. Организуя
плавучесть отдельной переменной. Всё совпадает. И да, я в курсе,
что нельзя проверять значения на равенство, если хотя бы одно из
них - плавающее. - Nikolay_Po(26.02.2026 23:25)
- А вот этот способ прямо заинтересовал. Можете пример привести? - Dingo(27.02.2026 07:18)
- Так, например: Nikolay_Po(978 знак., 27.02.2026 10:49)
- Спасибо за ответ. Я ошибочно предположил, что в сторону fixed point
будет реверанс. - Dingo(27.02.2026 10:53)
- Ну так это и есть фиксд пойнт. Только не библиотечный, а ситуативный. Эта 1024 в примере выше - и есть фиксация точки. - Nikolay_Po(27.02.2026 11:08)
- Спасибо за ответ. Я ошибочно предположил, что в сторону fixed point
будет реверанс. - Dingo(27.02.2026 10:53)
- Так, например: Nikolay_Po(978 знак., 27.02.2026 10:49)
- А вот этот способ прямо заинтересовал. Можете пример привести? - Dingo(27.02.2026 07:18)
- Там, где требуется ТАКАЯ точность, я считаю в целых. Организуя
плавучесть отдельной переменной. Всё совпадает. И да, я в курсе,
что нельзя проверять значения на равенство, если хотя бы одно из
них - плавающее. - Nikolay_Po(26.02.2026 23:25)
- Компилятор не обязан это уметь. И добавлю третий нюанс: результат
"плавучих" операций, вычисленный компилятором, может отличаться от
результата, полученного в рантайме. - LightElf(26.02.2026 19:50)
- Та ну! С удовольствием использую везде, где нужно определить
константы. Не всё удобно и просто считать целыми. Поэтому не
парюсь, в расчёте на то, что препроцессор посчитает и преобразует в
целое. Тут промахнулся. - Nikolay_Po(24.02.2026 09:41)
- Хех. А если знать правила неявного приведения типов, то ничего
удивительного. Там правила довольно простые, советую выучить. - SciFi(24.02.2026 08:35)
- Правила преобразования знаковое - беззнаковое мне не кажутся
простыми. AlexBi(104 знак., 24.02.2026 10:33)
- По ссылке цитата из стандарта. Она только кажется длинной и
сложной, там суть довольно простая, если немного вникнуть: SciFi(37 знак., 24.02.2026 11:00, ссылка, ссылка)
- В первой цитате не увидел ничего про насыщение при переводе из дабла в целое. А вот во второй: Nikolay_Po(106 знак., 24.02.2026 11:02)
- По ссылке цитата из стандарта. Она только кажется длинной и
сложной, там суть довольно простая, если немного вникнуть: SciFi(37 знак., 24.02.2026 11:00, ссылка, ссылка)
- Дык, Когда пишешь выражение: это равно тому-то - помнишь. А тут инкремент, немного другая запись. Интуитивно полагал, что если слева целое, то целое и запишется. Преобразуется к целому и запишется. И оно преобразовалось, и записалось. С побочными эффектами в виде раздувания кода, времени выполнения и, главное, с насыщением результата! - Nikolay_Po(24.02.2026 09:29)
- Правила преобразования знаковое - беззнаковое мне не кажутся
простыми. AlexBi(104 знак., 24.02.2026 10:33)
- Ну т.е. вместо переполнения получалось 0xFFFFFFFF ??? Интересно... - il-2(24.02.2026 06:38)
- Именно. Сильно удивился значению. Думал, может, у меня инкремент
чётко кратно 2^32-1 вышел. Проверил - нет. Понял, что насыщение и
заподозрил преобразование из плавающей точки. Оно самое, оказалось. - Nikolay_Po(24.02.2026 09:20)
- Вот такой он внезапный, Undefined Behavior ;-) - LightElf(26.02.2026 18:48)
- Именно. Сильно удивился значению. Думал, может, у меня инкремент
чётко кратно 2^32-1 вышел. Проверил - нет. Понял, что насыщение и
заподозрил преобразование из плавающей точки. Оно самое, оказалось. - Nikolay_Po(24.02.2026 09:20)
- Кстати, есть еще интересный вопрос на тему преобразований из
плавучки в целочисленную арифметику. Как происходит/не происходит
округление? Что говорит стандарт? Тоже ундефинед бехавиор? il-2(151 знак., 27.02.2026 16:23)