Порядок — это хаос, который нам понятен.
Генри Миллер ИнструментыРедактор: Far Manager® 3.0 build 4545 x86
Компиляторы:Microsoft® JScript 5.8.18205, Node.js® v0.12.0, SpiderMonkey-1.8.5
Форматеры: js-beautify v1.5.4, Artistic Style 2.04
Оптимизатор:Google® Closure Compiler v20160208
Линтеры: JavaScript Lint 0.3.0 (Matthias Miller), Google® Closure linter 2.3.17
Исходный код
#!/usr/bin/env node
/**
@name nominal.js
@author XGuest <xguest@list.ru>
@link https://github.com/xguest/nominal
@version 1.0.0.0
@copyright GPL applies.
No warranties XGuest[05.02.2016/09:48:26] nominal[ver.1.0.0.0]
#guid {A645E9CA-BE33-4642-AF0F-B4EF046D31E7}
@description Подбирает значения числовых номиналов из стандартных
РЯДЫ ПРЕДПОЧТИТЕЛЬНЫХ ЗНАЧЕНИЙ ДЛЯ РЕЗИСТОРОВ И КОНДЕНСАТОРОВ
Соответствует ГОСТу-28884-90, МЭК 63 63
@param {Number} [a] Для положительных - Подбираемый номинал,
Для отрицательных - Индекс a >= (-1 * b)
undefined - рекурсия всех значений ряда b
@param {Number} [b] Номер номинального ряда стандарта
E3, E6, E12, E24, E48, E96, E192.
undefined - рекурсия всех рядов значения a
@return {Number|Object} Для (a || b) = undefined - Object номиналов
Во всех остальных случаях предпочтительное значение
@example
// Нет параметров
nominal() ; // вернет объект всех таблиц стандарта, где:
// ключ - номер ряда,
// значение - объект индексов и значений для этого ряда
// {"3": {"1": 1, "2": 2.2, "3": 4.7},
// ...................................................................
// "192": {........................................................}}
// Только индекс
nominal(-5); // ==> объект всех рядов для индекса "5", где:
// ключ - номер ряда,
// значение - номинал с индексом "5" для этого ряда, для ряда 3 нет индекса 5
// {"6": 4.7, "12": 2.2, "24": 1.5, "48": 121, "96": 110, "192": 105}
// Только значение
nominal(5); // ==> объект всех рядов для номинала "5", где:
// ключ - номер ряда,
// значение - номинал меньше значения "5" для этого ряда
// {"3": 4.7, "6": 4.7, "12": 4.7, "24": 4.7, "48": 4.87, "96": 4.99, "192": 4.99}
// Индекс и номер ряда
nominal(-6,6);// ==> "6.8" Значение номинала с индексом "6" в ряду "6"
nominal(6, 6);// ==> "4.7" Значение номинала меньше "6" в ряду "6"
*/
function nominal(a, b) {
ln = function(a, b) { // Логарифм
return parseInt(Math.log(a) / Math.LN10 * (b || 1), 10); // Целая часть
};
pg = function(a, c) { // Степень по основанию 10
var d = 25 > b ? 1 : 2; // Правило округления
0 > a && (d -= a); // Для отрицательных
return Number((Math.pow(10, a) * (c || 1)) // c = Мантисса
.toFixed(0 < d ? d : void 0)); // Округление
};
var c, d = {}; // c = tmp_var; d = out_var;
if (!b) { // Не получен номер ряда
for (b = 0; 7 > b; b++) { // Цикл рядов номиналов
c = 3 * Math.pow(2, b); // Номер номинального ряда
d[c] = arguments.callee(a, c); // Рекурсия
}
return d; // Объект номиналов
}
if (!a) { // Не получен номинал
for (a = 1; a < b + 1; a++) { // Цикл по номиналам ряда
d[a] = arguments.callee(-1 * a, b); // Рекурсия
}
return d; // Объект номиналов
}
a = 0 > a ? // a < 0 получен индекс
(c = 25 > b ? 0 : 2, -1 * a - 1) : //
(c = ln(a), d = ln(a / pg(c), b), d < 0 ? b + d : d); // индекс номинала
for (d = 0; 7 > d; d++) { // Проверка ОДЗ
if (b == (3 * Math.pow(2, d))) {d = 8;break;} // для рядов номиналов
}
if (d != 8 || Math.abs(a) > b) return; // для индексов номиналов
a = pg(a / b); // Номинал по индексу
return pg(c, // Разрядность
{'2.6': 2.7, '2.9': 3, '3.2': 3.3, '3.5': 3.6, '3.8': 3.9, // Исключения
'4.2': 4.3, '4.6': 4.7, '8.3': 8.2, '9.19': 9.2}[a] || a);
}
module.exports = nominal;
Для проверки номиналов резисторов попросили найти программу, посмотрел, что есть в интернете и решил написать сам. Из текста ГОСТа составил маленькую выборку, а по ней, скрипт. Прошу высказывать свои замечания, возможно что-то пропустил или способ проще есть?
Из ГОСТа
Номинальные ряды по ГОСТ-28884-90 представляют собой экспоненциально растущую последовательность значений.
Содержат 7 рядов, с различным допуском отклонения от номинального значения:
E3 >±20%, E6 ±20%, E12 ±10%, E24 ±5%, E48 ±2%, E96 ±1%, E192 ±0,5%
Номер ряда определяет общее число элементов номинального ряда и максимальное значение порядкового номера элемента.
Например, E3 — 3 элемента от 1 до 3… E192 — 192 элемента от 1 до 192.
Значение номинала формулой: c = 10^((a — 1) / b)
a — порядковый номер элемента,
b — номинальный ряд (3 * 2^n), n — число от 0 до 6,
c — номинал.
Для получения номинала — значение таблицы умножить на 10 в степени n:
n — любое положительное или отрицательное число.
Исключения:
Для рядов с E3 по E24 расчетные значения 2.6, 2.9, 3.2, 3.5, 3.8, 4.2, 4.6 — меньше на 0.10, значение 8.3 — больше на 0.10 номинала ряда.
Для ряда E192 расчетное значение 9.19 — меньше на 0.01 номинала ряда.
Значения в десятичной степени, для рядов:
— с 3 по 24: 9.10 — 1 степень,
— с 48 по 192: 988,00 — 3 степень
Обратная формула индекс по значению: a = lg(с) * b + 1
a — порядковый номер элемента,
b — номинальный ряд,
c — номинал.
Правило перехода логарифма к новому основанию.
log_a(b) = log_d(b) / log_d(a)
function log(a, b) {return Math.log(b) / Math.log(a);};
Ну вот, вроде бы, и все.
Всем удачи.
XGuest