Здравствуйте, dmitry_npi, Вы писали:
_>Здравствуйте! _>Для перевода из радиан в градусы и обратно я написал такой код: _>
_>// перевод из радиан в градусы и обратно
_>template<class RealType>
_>inline RealType RadToGr(RealType rad)
_>{
_> return rad*(RealType)(180/M_PI);
_>}
_>
_>А мой коллега, человек старшего поколения, и шаблоны не очень любящий, такой:
_>
Здравствуйте, Alxndr, Вы писали:
A>А для кошерности по самое не могу, можно еще ввести отдельные типы для градусов и радианов (с соответствующими преобразованиями). A>После этого автор топика поймет, что первоначальный вариант усложнением не являлся
А для полной кошерности надо еще ввести классы Gradus, Minute, Second, соответсвующие конструкторы (например, Gradus(Minute), соответствующие operator приведения, добавить всякие operator арифметики (к минутам градусы прибавить и т.п.) В общем, меньше чем на 200-300 строк кода это ИМХО никак не тянет. Зато как красиво смотреться будет . И сколько времени можно на это потратить!
Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?
Здравствуйте, Pavel Dvorkin, Вы писали:
A>>А для кошерности по самое не могу, можно еще ввести отдельные типы для градусов и радианов (с соответствующими преобразованиями). A>>После этого автор топика поймет, что первоначальный вариант усложнением не являлся
PD>А для полной кошерности надо еще ввести классы Gradus, Minute, Second, соответсвующие конструкторы (например, Gradus(Minute), соответствующие operator приведения, добавить всякие operator арифметики (к минутам градусы прибавить и т.п.) В общем, меньше чем на 200-300 строк кода это ИМХО никак не тянет. Зато как красиво смотреться будет . И сколько времени можно на это потратить!
Да уж, один раз потратить на это время и — если постоянно работаем с градусами/минутами/секундами — забыть о проблемах перевода физических величин (уменьшение кода + многие ошибки уйдут).
PD>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?
Нет, что Вы, что Вы, все эти классы и шаблоны излишества современной испорченной молодежи.
Закаленным бойцам дучше бы писать в стиле Фортран.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А для полной кошерности надо еще ввести классы Gradus, Minute, Second, соответсвующие конструкторы (например, Gradus(Minute), соответствующие operator приведения, добавить всякие operator арифметики (к минутам градусы прибавить и т.п.) В общем, меньше чем на 200-300 строк кода это ИМХО никак не тянет. Зато как красиво смотреться будет . И сколько времени можно на это потратить!
Как я уже указывал, это уже сделали за нас. Осталось только воспользоваться плодами чужого труда.
PD>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?
Переводить-то они переводили, да вот только компайлер им по польцам при этом не давал.
Здравствуйте, Alxndr, Вы писали:
A>Да уж, один раз потратить на это время и — если постоянно работаем с градусами/минутами/секундами — забыть о проблемах перевода физических величин (уменьшение кода + многие ошибки уйдут).
А можно пример реальной ошибки в реальном проекте, связанной с переводом из радианов в градусы ? В общем, был ли мальчик ?
И пример уменьшения кода тоже, если можно.
Ну а потом — почему только из радианов в градусы ? Еще можно строк 500 потратить на киловатт-часы, калории, джоули и т.д.. Потом на ньютоны и килограммы. А еще лучше сразу начать фундаментальную библиотеку классов писать SI/CGS. Тут никак меньше чем парой человеко-лет не обойдешься
PD>>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?
A>Нет, что Вы, что Вы, все эти классы и шаблоны излишества современной испорченной молодежи.
Именно
A>Закаленным бойцам дучше бы писать в стиле Фортран.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А можно пример реальной ошибки в реальном проекте, связанной с переводом из радианов в градусы ? В общем, был ли мальчик ?
Была известная реальная ошибка, но проблема была не с радианами и градусами, а с фунт-силами и ньютонами
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А можно пример реальной ошибки в реальном проекте, связанной с переводом из радианов в градусы ? В общем, был ли мальчик ?
Да полно таких ошибок на самом деле. Например, когда мы управляли марсианским ровером в процессе последнего ICFP contest, были баги именно с переводом градусов в радианы .
Если посмотреть чуть шире, то такая ошибка (смешивание разнотипных с точки зрения предметной области, но однотипных с точки зрения языка программирования сущностей) встречается сплошь и рядом. Примеры — строки в разных кодировках, числа с разной endiannes, сырые строки и escape-нутые (весь cross-site scripting на подобных багах держится).
Здравствуйте, palm mute, Вы писали:
PD>>А можно пример реальной ошибки в реальном проекте, связанной с переводом из радианов в градусы ? В общем, был ли мальчик ?
PM>Да полно таких ошибок на самом деле. Например, когда мы управляли марсианским ровером в процессе последнего ICFP contest, были баги именно с переводом градусов в радианы .
PM>Если посмотреть чуть шире, то такая ошибка (смешивание разнотипных с точки зрения предметной области, но однотипных с точки зрения языка программирования сущностей) встречается сплошь и рядом. Примеры — строки в разных кодировках, числа с разной endiannes, сырые строки и escape-нутые (весь cross-site scripting на подобных багах держится).
Причем, что обидно, еще 20-30 лет назад были созданы обычные императивные языки, которые подобные ошибки устраняли чуть ли не напрочь. Всего-то нужно было ввести strict typedef-ы: когда из одного и того же базового типа получается произвольное количество несовместимых между собой подтипов. Вроде того, как это сейчас делается в D:
typedef float radians;
typedef float degres;
const radians one_radian = 1;
degres d = one_radian * 5; // А тут нам компилятор по рукам, по рукам!
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Причем, что обидно, еще 20-30 лет назад были созданы обычные императивные языки, которые подобные ошибки устраняли чуть ли не напрочь. Всего-то нужно было ввести strict typedef-ы: когда из одного и того же базового типа получается произвольное количество несовместимых между собой подтипов. Вроде того, как это сейчас делается в D: E>
E>typedef float radians;
E>typedef float degres;
E>const radians one_radian = 1;
E>degres d = one_radian * 5; // А тут нам компилятор по рукам, по рукам!
E>
А где автоматический пересчёт one_radian в degres? А в Boost.Units и это есть.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Ну а потом — почему только из радианов в градусы ? Еще можно строк 500 потратить на киловатт-часы, калории, джоули и т.д.. Потом на ньютоны и килограммы. А еще лучше сразу начать фундаментальную библиотеку классов писать SI/CGS. Тут никак меньше чем парой человеко-лет не обойдешься
В библиотеке, которую я привёл, именно что полная система SI/CGS и имплементирована. Но посмотреть документацию ведь так сложно! Тупо флеймить куда проще!
_>В библиотеке, которую я привёл, именно что полная система SI/CGS и имплементирована. Но посмотреть документацию ведь так сложно! Тупо флеймить куда проще!
Посмотрел. Спасибо. Теперь буду знать, что для того, чтобы перевести из ньютонов в килограммы, надо прочитать 450 страниц документации, скачать некие файлы, увеличить размер EXE на десяток килобайт и добавить DLL.
Здравствуйте, Klapaucius, Вы писали:
K>Была известная реальная ошибка, но проблема была не с радианами и градусами, а с фунт-силами и ньютонами
K>здесь.
Нет, батенька, не пойдет.
>used Imperial units (pound-seconds) instead of the metric units (newton-seconds) as specified by NASA
Здесь не ошибка перевода из одной системы в другую, а использование не той единицы. Тут Вам никакая библиотека не поможет — если надо в формуле использовать newton-seconds, а вы вводите величину в pound-seconds, вам никто не поможет.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, skeptik_, Вы писали:
_>>В библиотеке, которую я привёл, именно что полная система SI/CGS и имплементирована. Но посмотреть документацию ведь так сложно! Тупо флеймить куда проще!
PD>Посмотрел. Спасибо. Теперь буду знать, что для того, чтобы перевести из ньютонов в килограммы, надо прочитать 450 страниц документации, скачать некие файлы, увеличить размер EXE на десяток килобайт и добавить DLL.
ОК, желаю Вам и дальше присваивать килограммам -- ньютоны, футам -- метры, а амперам -- кулоны. Viel Glück dabei!
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, skeptik_, Вы писали:
_>>ОК, желаю Вам и дальше присваивать килограммам -- ньютоны, футам -- метры,
PD>Спасибо. До сих пор проблем никогда не имел, надеюсь и дальше их не иметь.
>>а амперам -- кулоны.
PD>А вот за такое надо обратно в школу отправлять
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?
Ариан-5 убедительно продемонстрировал ответ на этот вопрос.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, Klapaucius, Вы писали:
K>>Была известная реальная ошибка, но проблема была не с радианами и градусами, а с фунт-силами и ньютонами
K>>здесь.
PD>Нет, батенька, не пойдет.
>>used Imperial units (pound-seconds) instead of the metric units (newton-seconds) as specified by NASA
PD>Здесь не ошибка перевода из одной системы в другую, а использование не той единицы. Тут Вам никакая библиотека не поможет — если надо в формуле использовать newton-seconds, а вы вводите величину в pound-seconds, вам никто не поможет.
Значит, Вы считаете, что программист бодренько писал бы: quantity<length> x = 2.0 * feet; используя при этом метры?
Здравствуйте, skeptik_, Вы писали:
E>>Всего-то нужно было ввести strict typedef-ы: когда из одного и того же базового типа получается произвольное количество несовместимых между собой подтипов. Вроде того, как это сейчас делается в D: E>>
E>>typedef float radians;
E>>typedef float degres;
E>>const radians one_radian = 1;
E>>degres d = one_radian * 5; // А тут нам компилятор по рукам, по рукам!
E>>
_>А где автоматический пересчёт one_radian в degres?
Для тех, кто в boos..., ой, в танке, повторяю: strict typedef-ы предназначены для того, чтобы запретить любое неявное автоматическое преобразование. Благодоря им разработчик должен указать, что именно он хочет сделать:
degres d = radian_to_degres( one_radian * 5 );
или же
degres d = one_degree * 5;
_> А в Boost.Units и это есть.
Нет бога кроме C++а, а Boost -- пророк его. Аминь.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, skeptik_, Вы писали:
PD>>Спасибо. До сих пор проблем никогда не имел, надеюсь и дальше их не иметь.
>>>а амперам -- кулоны.
PD>>А вот за такое надо обратно в школу отправлять
_>А килограммы и ньютоны значит одной размерности?
Килограммы (силы, а не массы) и ньютоны — это разные единицы измерения одной и той же величины (силы), и их можно переводить друг в друга. А вот кулоны и амперы — это разные величины (единица количества электричества и единица силы тока) , а поэтому за перевод из кулонов в амперы или обратно надо отправлять в среднюю школу .
Мягко выражаясь, немного не та ситуация. Ошибка-то была в подпрограмме преобразования . Без нее в любом случае бы не обошлись, но вот, увы, ошибочка вкралась. Бывает.
А я все же просил пример по ошибке при умножении на 180 и делении на PI. Или наоборот.
Кстати, маленький вопрос. А просто для умножения на 180 (ну не знаю зачем это надо) тоже нужно специальную подпрограмму писать или нет ?