Операции с переменными разных типов
- Войдите на сайт для отправки комментариев
Вс, 22/01/2017 - 13:55
Уже ранее сталкивался с неоднозначнми результатами при использовании в выражении переменных разных типов, притом даже одинаковые выражения с одинаковыми переменными в разных местах программы давали разныее результаты.
На данный момент потребовалось нормально посчитать SIN((micros()/20000+a/3)*2*PI()) , micros() имеет тип unsigned long, другие 4 int и последний float.
Подскажите пожалуйста как правильно это записывать не теряя быстродействия, памяти и получать прогнозируемый результат?
можно так попробовать.
Видите ли, программа работает в точности так, как ее написал программист, но не так, как он хотел написать. Такое объяснение объясняется просто: компилятор ничего не знает о желаниях программиста. Возможно, для Вас это будет новостью, но другие программисты, так же, как и компилятор, не осведомлены о Ваших желаниях, поэтому тоже могут судить лишь о том, что Вы написали, но не о том, что хотели написать.
В приведенном Вами выражении происходят неоднократные округления до целых. Нужно ли это Вам или как раз это и является Вашей ошибкой, никто кроме Вас не знает.
Видите ли, программа работает в точности так, как ее написал программист, но не так, как он хотел написать. Такое объяснение объясняется просто: компилятор ничего не знает о желаниях программиста. Возможно, для Вас это будет новостью, но другие программисты, так же, как и компилятор, не осведомлены о Ваших желаниях, поэтому тоже могут судить лишь о том, что Вы написали, но не о том, что хотели написать.
В приведенном Вами выражении происходят неоднократные округления до целых. Нужно ли это Вам или как раз это и является Вашей ошибкой, никто кроме Вас не знает.
Компилятор знает заранее все типы данных и должен использовать для вычисления выражения(где читал уже непомню) самый большой тип, так было в версиях до 1.0.
В версиях выше 1.5 это сломанно притом рандомно - 4 одинаковых условия с одинаково обьявленными переменными, а правильно считается только первое, при переходе от версии к версии грабли вылезают в разных местах.
Вопрос заключается в том как правильно, не раздувая код указать компилятору преобразование типов и/или сразу часть переменных сделать нужного типа?
П.С. в формуле в шапке ошибка связанная с нежелательным преобразованием типов, на данный момент SIN(float((micros() % period) + n[f])/period1) , все переменные кроме "period1" unsigned long, "period1" float.
... так было в версиях до 1.0.
В версиях выше 1.5 это сломанно притом рандомно - 4 одинаковых условия с одинаково обьявленными переменными, а правильно считается только первое, при переходе от версии к версии грабли вылезают в разных местах.
Вы чего-то очень серьёзно не поняли или поняли не так. Компилятор всегда работал одинаково и сейчас работает также, а текст, который я процитировал, является параноидальным бредом. Вам нужно разобраться в этом вопросе иначе будете постоянно наступать на грабли "в разных местах".
Не, ну я же так и сказал, что Вычего-то очень серьёзно не поняли или поняли не так.
Вы просто не понимаете как они должны работать и не видите каких-то тонких отличий. Конкретнее сказать не могу, пока не увижу примеров. Но в любом случае, С - это достаточно старый язык и никаких изменений за последние годы он не претерпел.
То, что IDE-шный препроцессор меняется, так компилятор тут не при делах.
П.С. У меня оказывается опять старый IDE 1.6.12, актуальная версия 1.8.1, а виндам всего 3 месяца...
Иногда размер кода зависит от версии !плат! и отличается на 200+ байт! (1.6.9 - 1.6.14)
1. не понял, что написано в строке 6
2) не нашёл описание массива n
Странно, вроде не комментарий.
Как он описан?
А массив - он не переменная? У него типа нет7 Или его ти нни на что не влияет?
Ну, если так, то, вроде нормально, но float() явно лишнее. Хотя, и не мешает.
Иногда размер кода зависит от версии !плат! и отличается на 200+ байт! (1.6.9 - 1.6.14)
Это вполне естественно. Более того, это является основой концепции языков высокого уровня.
Кстати, если бы Вы потрудились попробовать на всех платах Ардуино, то вместо "отличается на 200+ байт" написали бы "отличается на десятки килобайт".