Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
/*
Шаг по оси, представляет собой число из следующего ряда:
... 0.02 0.05 0.1 0.2 0.5 1 2 5 ...
next и prev позволяют перемещаться в обе стороны по ряду
после создания хранится число 1
*/
class Step
{
public:
Step()
{
scale = 1; pr = 1; type=0;
}
void next()
{
// шаг вперед
type++;
if (type==1)
scale = pr * 2;
else if (type==2)
scale = pr * 5;
else
{
type = 0;
pr *= 10;
scale = pr;
}
}
void prev()
{
// шаг назад
type--;
if (type==0)
scale = pr;
else if (type==1)
scale = pr*2;
else
{
type = 2;
pr /= 10;
scale = pr*5;
}
}
operator float()
{
return scale;
}
protected:
float scale; // текущее значение
float pr; // недомноженое значение 1 10 100 ...
int type; // 0 - x1 1 - x2 2 - x5
};
http://govnokod.ru/10117 напомнил о том, как я когда-то рисовал график, и для меток на осях потребовались те же самые красивые значения [... 0.1 0.2 0.5 1 2 5 ...]
Операции с плавающей точкой особого оптимизма не внушают.
Нельзя сделать тип со степенями для 2, 5 и флагом какую использовать для next / prev? Отдельно ф-ию, возвращающую уже число, ее в map.
В тех пределах, в которых использовались эти next и prev (подбор оптимальной цены деления на графике) погрешность еще не успевала накопиться, поэтому я забил и оставил этот говнокод.
А в идеале наверное да, сделать pr int'ом, и хранить в нем степень десятки, и при необходимости домножать ее на 1, 2 или 5.
Ага. Оказывается, для n=5;10;20;40;80;160 есть вореции стандарта: R10, R'10, R''10, Ra10 (отличаются интенсивностью округления относительно точного значения корня n-й степени).
Кстати, я нашёл две линейки стандартов:
1) n=5;10;20;40;80;160 (включая вариации со штрихом, с двумя штрихами и с буквой «a») для линейных размеров (ISO/DIN/ГОСТ).
2) n=6;12;24;48;96;192 для сопротивлений (IEC a. k. a. МЭК).
Для n < 5 ряды довольно простые. А есть ли стандарты для остальных значений n?
Нельзя сделать тип со степенями для 2, 5 и флагом какую использовать для next / prev? Отдельно ф-ию, возвращающую уже число, ее в map.
А в идеале наверное да, сделать pr int'ом, и хранить в нем степень десятки, и при необходимости домножать ее на 1, 2 или 5.
https://ru.wikipedia.org/wiki/Ряды_предпочтительных_чисел_(в_технике)
При n=2 получим 1 3 10 30 100 300 1000...
При n=3 получим 1 2 5 10 20 50 100 200 500...
При n=4 получим 1 2 3 6 10 20 30 60 100 200 300 600...
При n=5 получим 1 1,6 2,5 4 6,3 10 16 25 40 63 100...
При n=6 получим 1 1,5 2 3 5 7 10 15 20 30 50 70 100...
При n=7 получим 1 1,4 1,9 2,7 3,7 5,2 7,2 10...
При n=8 получим 1 1,3 1,8 2,3 3,2 4,2 5,6 7,5 10...
При n=9 получим 1 1,3 1,7 2,2 2,8 3,6 4,6 6 7,7 10...
При n=10 получим 1 1,3 1,6 2 2,5 3,2 4 5 6,3 8 10...
Отдельные множители можно корректировать, чтобы получать более красивые числа.
Слабо́ написать класс для произвольного n, а также для принятых в технике рядов сопротивлений, диаметров резьбы и т. п.?
https://github.com/matt-hayden/PreferredNumbers
https://github.com/matbra/preferred_numbers
Кстати, я нашёл две линейки стандартов:
1) n=5;10;20;40;80;160 (включая вариации со штрихом, с двумя штрихами и с буквой «a») для линейных размеров (ISO/DIN/ГОСТ).
2) n=6;12;24;48;96;192 для сопротивлений (IEC a. k. a. МЭК).
Для n < 5 ряды довольно простые. А есть ли стандарты для остальных значений n?
Хм, там же вроде Е-ряды были?
З.Ы. В детстве всегда удивлялся, почему у резисторов такие кривые номиналы - 470, 560, 820, 680 и т.п.
Обычно видел из ряда E24. Но несколько раз попадались из E96 (в делителе, задающем образцовое напряжение в блоке питания).
Вот с диаметрами резьбы и теми же пинами микросхем вообще жопа - где-то метрические, где-то пиндосские...
А у микросхем вообще одна и та же серия может иметь модификации в разных корпусах, один корпус в метрической системе, другой — в пиндосской.