Стандартное целочисленное / плавающее арифметическое поведение GCC - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть набор очень длинных уравнений, которые я изначально написал для MATLAB.Теперь я должен перенести его на встроенный C для моего контроллера.Поведение по умолчанию

C и C ++ при записи double a = 1/3; должно возвращать 0, поскольку оно анализируется как целочисленная арифметика.Интересно, есть ли способ отключить это поведение, так что мне не нужно добавлять .0 к каждому постоянному числу в уравнениях.

Например, следующее является относительно коротким:

eq = (121.0/16.0*pow(d,4)*pow(r,2)*pow(x,10)+2*pow(r,2)*pow(11.0/6.0,3)*pow(d,4)*pow(x,10) + pow(r,2)*pow(11.0/6.0,6)*pow(d,6)*pow(x,18) + pow(r,2)*pow(d,2)*pow(x,2) - pow(jmax,2));

Моя цель - компьютер ARM, поэтому я использую Linaro GCC.

Редактировать:

Как оказалось, изменение поведения GCC было огромным нет-нет.Решил это с помощью регулярных выражений, благодаря @Matteo Italia.Закончилось написание небольшого решения на основе Qt для замены ^ в качестве степенных символов и добавления конечных .0 к буквальным числам, доступных здесь: https://github.com/pauloasherring/MATEquationToC Если вы хотите его использовать, делайте это на свой страх и риск :)

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Попробуйте использовать касту: double a = (double) 1/3 ..

0 голосов
/ 10 декабря 2018

Нет.Это фундаментальный синтаксис, и его нельзя изменить.

Даже если бы это было возможно, я бы избегал этого любой ценой, поскольку ваш проект на C больше не был бы реальным C, а каким-то странным диалектом с огромным разница в семантике числовых литералов;повторное использование кода из вашего проекта, импорт кода из другого проекта или работа с кем-либо еще над вашим проектом может быть угрозой правильности.

FWIW, пропущенные точки можно добавить через тривиальное регулярное выражение, например:

Поиск: ([^.]|^)\b([0-9]+)\b([^.]|$)

Заменить: $1$2.0$3

(для максимальной мобильности не требуется смотреть вперед / назад)

...