Re: Усложняю ли я?..
От: Andy Panda США  
Дата: 05.08.08 17:19
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

_>Здравствуйте!

_>Для перевода из радиан в градусы и обратно я написал такой код:
_>
_>// перевод из радиан в градусы и обратно
_>template<class RealType>
_>inline RealType RadToGr(RealType rad)
_>{
_>    return rad*(RealType)(180/M_PI);
_>}
_>


_>А мой коллега, человек старшего поколения, и шаблоны не очень любящий, такой:


_>
_>const double G_R =  M_PI / 180.0;
_>const double R_G = 180.0 / M_PI;

_>/*... далее...*/
_>double degrees = radians*R_G;
_>

Подразумевается, что у коллеги вообще функций перевода нет, или же что они нешаблонные?

В плюсах разбираюсь не особо — можете ли описать, как работает ваш код? В чем его преимущество?

На проверку типов не похоже.

Если вы сами внятно не сможете объяснить, почему вы выбираете именно такое решение, то коллега прав — надо писать проще
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re[3]: Усложняю ли я?..
От: Pavel Dvorkin Россия  
Дата: 07.08.08 09:23
Оценка: :)
Здравствуйте, Alxndr, Вы писали:

A>А для кошерности по самое не могу, можно еще ввести отдельные типы для градусов и радианов (с соответствующими преобразованиями).

A>После этого автор топика поймет, что первоначальный вариант усложнением не являлся

А для полной кошерности надо еще ввести классы Gradus, Minute, Second, соответсвующие конструкторы (например, Gradus(Minute), соответствующие operator приведения, добавить всякие operator арифметики (к минутам градусы прибавить и т.п.) В общем, меньше чем на 200-300 строк кода это ИМХО никак не тянет. Зато как красиво смотреться будет . И сколько времени можно на это потратить!

Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?
With best regards
Pavel Dvorkin
Re[4]: Усложняю ли я?..
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 07.08.08 09:28
Оценка: :)
Здравствуйте, Pavel Dvorkin, Вы писали:

A>>А для кошерности по самое не могу, можно еще ввести отдельные типы для градусов и радианов (с соответствующими преобразованиями).

A>>После этого автор топика поймет, что первоначальный вариант усложнением не являлся

PD>А для полной кошерности надо еще ввести классы Gradus, Minute, Second, соответсвующие конструкторы (например, Gradus(Minute), соответствующие operator приведения, добавить всякие operator арифметики (к минутам градусы прибавить и т.п.) В общем, меньше чем на 200-300 строк кода это ИМХО никак не тянет. Зато как красиво смотреться будет . И сколько времени можно на это потратить!


Да уж, один раз потратить на это время и — если постоянно работаем с градусами/минутами/секундами — забыть о проблемах перевода физических величин (уменьшение кода + многие ошибки уйдут).

PD>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?


Нет, что Вы, что Вы, все эти классы и шаблоны излишества современной испорченной молодежи.
Закаленным бойцам дучше бы писать в стиле Фортран.
Re[4]: Усложняю ли я?..
От: skeptik_  
Дата: 07.08.08 10:02
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А для полной кошерности надо еще ввести классы Gradus, Minute, Second, соответсвующие конструкторы (например, Gradus(Minute), соответствующие operator приведения, добавить всякие operator арифметики (к минутам градусы прибавить и т.п.) В общем, меньше чем на 200-300 строк кода это ИМХО никак не тянет. Зато как красиво смотреться будет . И сколько времени можно на это потратить!

Как я уже указывал, это уже сделали за нас. Осталось только воспользоваться плодами чужого труда.

PD>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?

Переводить-то они переводили, да вот только компайлер им по польцам при этом не давал.
Re[5]: Усложняю ли я?..
От: Pavel Dvorkin Россия  
Дата: 07.08.08 10:14
Оценка: -1 :)
Здравствуйте, Alxndr, Вы писали:

A>Да уж, один раз потратить на это время и — если постоянно работаем с градусами/минутами/секундами — забыть о проблемах перевода физических величин (уменьшение кода + многие ошибки уйдут).


А можно пример реальной ошибки в реальном проекте, связанной с переводом из радианов в градусы ? В общем, был ли мальчик ?

И пример уменьшения кода тоже, если можно.

Ну а потом — почему только из радианов в градусы ? Еще можно строк 500 потратить на киловатт-часы, калории, джоули и т.д.. Потом на ньютоны и килограммы. А еще лучше сразу начать фундаментальную библиотеку классов писать SI/CGS. Тут никак меньше чем парой человеко-лет не обойдешься



PD>>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?


A>Нет, что Вы, что Вы, все эти классы и шаблоны излишества современной испорченной молодежи.


Именно

A>Закаленным бойцам дучше бы писать в стиле Фортран.


!!!
With best regards
Pavel Dvorkin
Re[6]: Усложняю ли я?..
От: Klapaucius  
Дата: 07.08.08 12:39
Оценка: 12 (1) :)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А можно пример реальной ошибки в реальном проекте, связанной с переводом из радианов в градусы ? В общем, был ли мальчик ?


Была известная реальная ошибка, но проблема была не с радианами и градусами, а с фунт-силами и ньютонами

здесь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[6]: Усложняю ли я?..
От: palm mute  
Дата: 07.08.08 13:20
Оценка: +4
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А можно пример реальной ошибки в реальном проекте, связанной с переводом из радианов в градусы ? В общем, был ли мальчик ?


Да полно таких ошибок на самом деле. Например, когда мы управляли марсианским ровером в процессе последнего ICFP contest, были баги именно с переводом градусов в радианы .

Если посмотреть чуть шире, то такая ошибка (смешивание разнотипных с точки зрения предметной области, но однотипных с точки зрения языка программирования сущностей) встречается сплошь и рядом. Примеры — строки в разных кодировках, числа с разной endiannes, сырые строки и escape-нутые (весь cross-site scripting на подобных багах держится).
Re[7]: Усложняю ли я?..
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.08.08 13:29
Оценка:
Здравствуйте, 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++.
Re[8]: Усложняю ли я?..
От: skeptik_  
Дата: 07.08.08 23:24
Оценка:
Здравствуйте, 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 и это есть.
Re[6]: Усложняю ли я?..
От: skeptik_  
Дата: 07.08.08 23:33
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну а потом — почему только из радианов в градусы ? Еще можно строк 500 потратить на киловатт-часы, калории, джоули и т.д.. Потом на ньютоны и килограммы. А еще лучше сразу начать фундаментальную библиотеку классов писать SI/CGS. Тут никак меньше чем парой человеко-лет не обойдешься


В библиотеке, которую я привёл, именно что полная система SI/CGS и имплементирована. Но посмотреть документацию ведь так сложно! Тупо флеймить куда проще!
Re[7]: Усложняю ли я?..
От: Pavel Dvorkin Россия  
Дата: 08.08.08 04:15
Оценка: -3
Здравствуйте, skeptik_, Вы писали:


_>В библиотеке, которую я привёл, именно что полная система SI/CGS и имплементирована. Но посмотреть документацию ведь так сложно! Тупо флеймить куда проще!


Посмотрел. Спасибо. Теперь буду знать, что для того, чтобы перевести из ньютонов в килограммы, надо прочитать 450 страниц документации, скачать некие файлы, увеличить размер EXE на десяток килобайт и добавить DLL.
With best regards
Pavel Dvorkin
Re[7]: Усложняю ли я?..
От: Pavel Dvorkin Россия  
Дата: 08.08.08 04:20
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Была известная реальная ошибка, но проблема была не с радианами и градусами, а с фунт-силами и ньютонами


K>здесь.


Нет, батенька, не пойдет.

>used Imperial units (pound-seconds) instead of the metric units (newton-seconds) as specified by NASA


Здесь не ошибка перевода из одной системы в другую, а использование не той единицы. Тут Вам никакая библиотека не поможет — если надо в формуле использовать newton-seconds, а вы вводите величину в pound-seconds, вам никто не поможет.
With best regards
Pavel Dvorkin
Re[8]: Усложняю ли я?..
От: skeptik_  
Дата: 08.08.08 04:33
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, skeptik_, Вы писали:



_>>В библиотеке, которую я привёл, именно что полная система SI/CGS и имплементирована. Но посмотреть документацию ведь так сложно! Тупо флеймить куда проще!


PD>Посмотрел. Спасибо. Теперь буду знать, что для того, чтобы перевести из ньютонов в килограммы, надо прочитать 450 страниц документации, скачать некие файлы, увеличить размер EXE на десяток килобайт и добавить DLL.


ОК, желаю Вам и дальше присваивать килограммам -- ньютоны, футам -- метры, а амперам -- кулоны. Viel Glück dabei!
Re[9]: Усложняю ли я?..
От: Pavel Dvorkin Россия  
Дата: 08.08.08 04:58
Оценка:
Здравствуйте, skeptik_, Вы писали:

_>ОК, желаю Вам и дальше присваивать килограммам -- ньютоны, футам -- метры,


Спасибо. До сих пор проблем никогда не имел, надеюсь и дальше их не иметь.

>а амперам -- кулоны.


А вот за такое надо обратно в школу отправлять
With best regards
Pavel Dvorkin
Re[10]: Усложняю ли я?..
От: skeptik_  
Дата: 08.08.08 05:11
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, skeptik_, Вы писали:


_>>ОК, желаю Вам и дальше присваивать килограммам -- ньютоны, футам -- метры,


PD>Спасибо. До сих пор проблем никогда не имел, надеюсь и дальше их не иметь.


>>а амперам -- кулоны.


PD>А вот за такое надо обратно в школу отправлять


А килограммы и ньютоны значит одной размерности?
Re[4]: Усложняю ли я?..
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.08.08 05:26
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Маленький вопрос сторонникам всех эти классов и темплейтов — как вы считаете, до появления C++ (и даже С) программисты градусы в радианы и обратно правильно переводили или нет ?

Ариан-5 убедительно продемонстрировал ответ на этот вопрос.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Усложняю ли я?..
От: skeptik_  
Дата: 08.08.08 05:35
Оценка:
Здравствуйте, 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; используя при этом метры?
Re[9]: Усложняю ли я?..
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.08.08 07:41
Оценка:
Здравствуйте, 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++.
Re[11]: Усложняю ли я?..
От: Pavel Dvorkin Россия  
Дата: 08.08.08 08:05
Оценка:
Здравствуйте, skeptik_, Вы писали:

PD>>Спасибо. До сих пор проблем никогда не имел, надеюсь и дальше их не иметь.


>>>а амперам -- кулоны.


PD>>А вот за такое надо обратно в школу отправлять


_>А килограммы и ньютоны значит одной размерности?


Килограммы (силы, а не массы) и ньютоны — это разные единицы измерения одной и той же величины (силы), и их можно переводить друг в друга. А вот кулоны и амперы — это разные величины (единица количества электричества и единица силы тока) , а поэтому за перевод из кулонов в амперы или обратно надо отправлять в среднюю школу .
With best regards
Pavel Dvorkin
Re[5]: Усложняю ли я?..
От: Pavel Dvorkin Россия  
Дата: 08.08.08 08:24
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ариан-5 убедительно продемонстрировал ответ на этот вопрос.


Ну что же, почитаем.

http://newman-by.livejournal.com/53420.html

>Ошибка крылась в подпрограмме, которая превращала 64-битные числа с плавающей запятой в 16-битные целые числа


или здесь

http://drcrasher.livejournal.com/1144632.html

>одна из вспомогательных подпрограмм попыталась преобразовать длинное целое значение в короткое без проверки величины значения


Мягко выражаясь, немного не та ситуация. Ошибка-то была в подпрограмме преобразования . Без нее в любом случае бы не обошлись, но вот, увы, ошибочка вкралась. Бывает.

А я все же просил пример по ошибке при умножении на 180 и делении на PI. Или наоборот.

Кстати, маленький вопрос. А просто для умножения на 180 (ну не знаю зачем это надо) тоже нужно специальную подпрограмму писать или нет ?
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.