Как стать автором
Обновить
55
0
Илья Попов @encyclopedist

Численное моделирование

Отправить сообщение

Более того, по этой ссылке написано, что на тот момент код 499 действовал уже 2 года, то есть с 2003 года.

Во первых только 25%, а во-вторых Carl Zeiss SMT это только одно из подразделений Carl Zeiss AG.

Zeiss не подразделение ASML

Китайцы то никуда не вводят? Помимо Тайваня, который уже упомянули, нужно ещё вспомнить Южно-Китайское море, где китайцы активно насыпают острова и строят военные базы чтобы захватить себе нефть, газ, рыбу и судоходные маршруты. https://en.wikipedia.org/wiki/Territorial_disputes_in_the_South_China_Sea

Подобных движух с нашей стороны не помню.

Российские бомбардировщики регулярно залетают в северное море и даже залетают в воздушное пространтво Нидерландов и Великобритании. Последний такой случай был в ноябре 2021 https://www.reuters.com/world/russian-planes-over-north-sea-intercepted-by-belgian-f-16s-dutch-defence-2021-11-12/

Нет, не стереотип, а квадратичный алгоритм при сортировке иконок: https://randomascii.wordpress.com/2021/02/16/arranging-invisible-icons-in-quadratic-time/

Да, Cygnus теперь может поднимать орбиту МКС. Проблема в том, что он запускается на ракете Антарес, у которой первая ступень производилась на КБ Южное (которое вероятно уничтожено, и в любом случае не сможет нормально работать в ближайшее время), а двигатели - российские, и попали под санкции. Так что Cygnus вероятно в ближайшее время больше не полетит.

В Бразилии используют этанол, а не метанол.

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

Только человек, не знакомый с географией, оценивает климат исключительно по широте.

Тогда перейти на forwad_as_tuple:

template<typename... Ts>
void wrapper(Ts&&... args)
{
    static_assert(sizeof...(args) == 3, "Wrapper takes exactly 3 arguments");
    auto t = std::forward_as_tuple(args...);
    do_something(std::get<bool&>(t), std::get<int&>(t), std::get<std::string_view&>(t));
}
template<typename... Ts>
void wrapper(Ts&&... args)
{
    static_assert(sizeof...(args) == 3, "Wrapper takes exactly 3 arguments");
    auto t = std::make_tuple(args...);
    do_something(std::get<bool>(t), std::get<int>(t), std::get<std::string_view>(t));
}

Если бы типы были более сложными, пришлось бы подумать как избежать лишних копий.

(неверно понял ваш комментарий, удалено)

Так почему бы их (хотя бы частично - отдельные фичи) не взять в стандарт?

Это происходит постояно. В списке фич в этом посте многие были вначале опробованы как раз в Boost

Помимо std::priority_queue в ситандартной библиотеке есть и более низкоуровневые операции с кучей, на основе которых можно строить и свои абстракции: make_heap, push_heap, pop_heap, sort_heap

Помимо максимальной ошибки, для тригонометрических функций часто важны и другие свойства:

  • Непрерывность

  • Дифференцируемость

  • Правильные значения при "специальных" значениях аргумента (0, 30, 45, 60, 90, ...)

  • Непревышение 1 модуля значения (чтобы не получить сюрпризы при `sqrt(1 - sin^2)`)

  • Во-первых, в x86 ЦПУ есть просто инструкции синуса и косинуса.

  • Если встроенные инструкции не использовать, (например, для векторизации, для воспроизводимости, или когда инструкции недоступны), то используется некий полином. Например, вот что делает библиотека SLEEF: https://github.com/shibatch/sleef/blob/85440a5e87dae36ca1b891de14bc83b441ae7c43/src/libm/sleefdp.c#L789-L840

    (сначала аргумент приводится к определенному диапазону, и затем используется полином 8 порядка)

Update: вот реализация из musl libc (в свою очередь, основана на реализации из freebsd):

static const double
S1  = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
S2  =  8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
S3  = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
S4  =  2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
S5  = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
S6  =  1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */

double __sin(double x, double y, int iy)
{
	double_t z,r,v,w;

	z = x*x;
	w = z*z;
	r = S2 + z*(S3 + z*S4) + z*w*(S5 + z*S6);
	v = z*x;
	if (iy == 0)
		return x + v*(S1 + z*r);
	else
		return x - ((z*(0.5*y - v*r) - y) - v*S1);
}

Насколько я понимаю, ядра тут вполне стоковые Neoverse N1 от ARM, и производство конечно же не собственное, что многократно упрощает задачу.

Update: а нет, пишут что ядра "модифицированный N1"

Garmin inReach Mini имеет размер с пару спичечных коробков (5 * 10 * 2.6 см включая антенну). Но он использует Iridium.

Информация

В рейтинге
4 299-й
Откуда
Delft, Zuid-Holland, Нидерланды
Дата рождения
Зарегистрирован
Активность