Comments 40
А вот действительно интересно, программируют ли атомные или космические станции, да и вообще проекты с крайне высокой ответственностью с использованием таких «обычных» средств как gcc?
Нет! Конечно же все атомные станции пишут на средствах необычных — вижуальнике, например! :)
Неа. Средства не обычные. Там используются системы автоматического доказательства корректности. Проверяется формальная корректность и всё такое прочее. Даже на уровне процессоров. Применяется нечто вроде этого: compcert.inria.fr/doc/
Такие вещи программируют на безопасных языках программирования, таких как Ada, например и компилируют другими компиляторами. Ну и многофазный процесс тестирования.
Мне пришлось некоторое время работать над бортовой программой одного из блоков самолёта SSJ-100. Нам запрещалось использовать опции комплятора, включающие оптимизацию, обосновывалось это именно непредсказуемостью результата оптимизации.
Насколько я знаю, для критически важных систем используются платные компиляторы с поддержкой. Они стоят хорошо, но дают гарантию на результат :)
Просто несколько лет назад пришлось делать кросс-компайл одного проекта на С++ под одну realtime OS, для которой и пришлось докупать отдельный компилятор.
Просто несколько лет назад пришлось делать кросс-компайл одного проекта на С++ под одну realtime OS, для которой и пришлось докупать отдельный компилятор.
Вы не поверите, эти платные средства разработки есть ничто иное как toolchain портированный по конкретную RTOS(VXworks, LynxOS, и т.д.).
Я не то, чтоб поверю, я это знаю :)
Но, насколько я был проинформирован, при заключении контракта на приобретение были указанны компенсации за ошибки, которые могли привести к финансовым потерям.
В моем конкретном случае, компиляторы использовались для построения системы контроля качества при производстве стекол для boing'ов на одном из заводов.
И отвечал я на вопрос что используется в проектах «с крайне высокой ответственностью», и говорил про гарантии, а не про то, что используется какой-то уникальный компилятор.
Но, насколько я был проинформирован, при заключении контракта на приобретение были указанны компенсации за ошибки, которые могли привести к финансовым потерям.
В моем конкретном случае, компиляторы использовались для построения системы контроля качества при производстве стекол для boing'ов на одном из заводов.
И отвечал я на вопрос что используется в проектах «с крайне высокой ответственностью», и говорил про гарантии, а не про то, что используется какой-то уникальный компилятор.
Ох как раздули багу в Development ветке GCC, вам бы не на хабр а в жёлтую газетёнку писать
Согласен. Особенно желтая до слепоты фраза:
при написании программ для атомных станций и ядерных боеголовок необходимо быть аккуратным применяя любые технологии.
Будьте аккуратны при написании программ для атомных станций и ядерных боеголовок с применением gcc :)
при написании программ для атомных станций и ядерных боеголовок необходимо быть аккуратным применяя любые технологии.
А почему g++ 4.6.0 стал вдруг девелопмент-веткой?
Надо сказать, что обнаружил баг не Иванов Максим, но именно он понял, что это не фича языка, а баг компилятора. Первоисточник, видимо, тут — тут
Это баг хотя бы пофиксили.
А вот такой код на некоторых компьютерах выдаёт, что значение функции без побочных эффектов от побайтово равных значений различно.
Причём никаких проблем с неточным хранением чисел в даблах там, вроде бы, нет — запас приличный.
Впрочем, это баг 10-летней давности, который до сих пор не закрывают (возможно, это связано с различиями в работе даблов на разных платформах).
Это баг хотя бы пофиксили.
А вот такой код на некоторых компьютерах выдаёт, что значение функции без побочных эффектов от побайтово равных значений различно.
Причём никаких проблем с неточным хранением чисел в даблах там, вроде бы, нет — запас приличный.
Впрочем, это баг 10-летней давности, который до сих пор не закрывают (возможно, это связано с различиями в работе даблов на разных платформах).
Ага, с багодаблами недавно как раз сталкивался.
Кто же станет сравнивать два double с помощью оператора ==? Это моветон.
ну вы блин даёте, а ну идти учить матчасть!!! :)
double переменная с плавающей точкой! Т.е. 1e3 не обязательно равно 10e2 и т.д. Используйте сравнение с определённой точностью и будет вам счастье. Вот пример реализации такого приведения:
double переменная с плавающей точкой! Т.е. 1e3 не обязательно равно 10e2 и т.д. Используйте сравнение с определённой точностью и будет вам счастье. Вот пример реализации такого приведения:
#define ROUND(num, denom) (((num) + (static_cast(denom)/2.0)))
или если совсем по православному
inline double ROUND(double p_num, const double p_denom)
{
return p_num + p_denom / 2.0;
}
ps: эту же функцию стоит применять при приведении double к int или к другому целочисленному типу, иначе так же получите проблемы. Поскольку число с плавающей точкой не округляется а обрезается до целой части при таком приведении.
прошу прощения если написал сумбурно, был в шоке :)
Спасибо за информацию, но даблы в моём примере в тех местах, где надо, сравниваются с точностью до 1e-9.
Фича программы как раз в том, что в main даблы должны сравниваться побайтно, что было явно виден баг оптимизатора. Если у нас функция rdn не имеет побочных эффектов, а аргументы побайтово равны, не должна ли она каждый раз возвращать одинаковый результат? Что же происходит внутри в этом случае — не суть важно.
А теперь, если всё-таки хотим, можем посмотреть на функцию rdn(double x): в первой строке идёт округление дабла. Согласен, если x=0.999999999, то результат будет нулём. Но затем мы прибавляем к этому числу пять (согласитесь, больше погрешности на порядки?), а потом в цикле while уменьшаем число, пока результат строго больше x с определённой точностью.
Фича программы как раз в том, что в main даблы должны сравниваться побайтно, что было явно виден баг оптимизатора. Если у нас функция rdn не имеет побочных эффектов, а аргументы побайтово равны, не должна ли она каждый раз возвращать одинаковый результат? Что же происходит внутри в этом случае — не суть важно.
А теперь, если всё-таки хотим, можем посмотреть на функцию rdn(double x): в первой строке идёт округление дабла. Согласен, если x=0.999999999, то результат будет нулём. Но затем мы прибавляем к этому числу пять (согласитесь, больше погрешности на порядки?), а потом в цикле while уменьшаем число, пока результат строго больше x с определённой точностью.
Прошу прощения, я сам был в шоке, а потом понял, что вы комментируете не мой код, а код из репорта :)
Что-то я не понял, как вообще «std::vector» можно использовать с gcc? Это-ж одна из фич с++, а не чистого с. Так что с gcc — всё в порядке, нужно опасаться g++
Gcc вообще критичный дальше некуда
rsdn.ru/forum/cpp/3358519.1.aspx
rsdn.ru/forum/cpp/3358519.1.aspx
Sign up to leave a comment.
Критическая ошибка gcc