Как стать автором
Обновить
54
0
ivanrt @ivanrt

Пользователь

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

Вроде понятно. Я просто раньше думал что можно обойтись и без второго потока. Каким-то образом жонглировать в единственном потоке всеми состояниями и переключать контекст по мере того как становятся доступными данные. А внутри под капотом select/epoll + файловые дескрипторы ну или CURL. Такое возможно? Скажем вызываешь co_await а там начинает шуршать вся эта машина состояний и возможно выполнится какой-то другой co_await из другого контекста и там пойдёт выполнение дальше...

Спасибо. Получается что вся кухня с callback и select никуда не делась, а работает себе в отдельном потоке, а в основном потоке что-то типа красивой обёртки - пользовательский интерфейс где можно выполнять высокоуровневые операции. Преимущество как мне кажется, что количество callback в коде будет значительно меньше. В данном случае будет только один :) Но если нужно добавить что-то другое помимо curl, то нужен либо отдельный поток, либо добавить это в WebClient::runLoop(). Я правильно понимаю? Например асинхронное чтения файла или server.accept(). Как бы вы поступили для такого расширения этого кода?

Что-то я не совсем понимаю или совсем не понимаю. doSomething() вызывает две функции с co_await .... Я так понимаю пока одна не закончится следующая не будет вызвана. А где же асинхронность? Можно какой-нибудь пример где два request выполняются наперегонки и печатают результат когда он будет доступен.

Извините, если это выглядело как травля или что-то такое. Согласен, с вашими рассуждениями и то что полагаться на мусор в последних разрядах числа это неправильно, поэтому как раз обычно используют epsilon при сравнениях, который вы активно отвергали в другом обсуждении. То что сделал ваш коллега-програмист очень похоже на poor-man's -fno-fast-math в данном куске кода - отрезать мусор, но в очень специфической ситуации, чтобы залатать проблему не желая разбираться в первопричинах. Вполне человеческое желание, как и желание начальника случайно ничего не сломать, так как нет полного понимания как это всё работает. Желаю вам найти понимание с коллегами или может других коллег. Я как бульдог, сначала я готов был с вами согласиться в вашей оценке ситуации, но заметив эту интересную особенность в коде вцепился в неё забыв об остальном.

Тут ещё можно добавить что позы в которых реальным людям может быть физически больно в AI можно делать без проблем со всей страстью и морем положительных эмоций у персонажей.

Мда, хабр сжевал double в std::numeric_limits<double>::epsilon() не знаю как у вас компилируется этот код.

$ g++ -o math math.cc -ffast-math -O2 && echo 1 | ./math
1 -1 0

Комментируем проверку:

$ g++ -o math math.cc -ffast-math -O2 && echo 1 | ./math
1 -1 1.11022e-16

Ладно, будем считать что мне не удалось продемонстрировать вам удивительный мир floating point на архитектуре x86.

Я вроде в оригинальном сообщение сказал что передавать надо 1. Смотреть надо на последнее выводимое число, так как только оно зависит от того добавлен ли if или удалён.

Вы будете удивлены сколько проектов используют -ffast-math. Дело в том что есть SIMD инструкции процессора и инструкции типа fmuladd которые компилятор не имеет права использовать без нарушения точности IEEE-754. Буду весьма удивлен если ваш проект не использует -ffast-math.

Тут зависит от оптимизаций - компилятор мог всё сам посчитать, поэтому надо часть значений передавать как внешние к программе, тогда компилятор не сможет просто выкинуть эти все вычисления и заменить результатом. Ну и см. ниже про -ffast-math.

static const double expected = 1. / 3. + 1;

int main() {
double num;
std::cin >>num;
std::cout << (num / 3. + 1 == expected);
}

Компилирую на intel/amd с 'gcc -ffast-math -O2'. Передаю '1' в програму - получаю результат - не равны. Что я делаю не так?

Ваши колеги чувствуют магию, а вы ещё нет ;) Если вы используете x86+ процессоры, то есть такое понятие как extended precision floating point (80 bit).

https://en.wikipedia.org/wiki/Extended_precision#x86_extended_precision_format

Процессоры интел (и иже с ними) делают операции с расширеной точностью, но компиляторы обычно пытаются избавится от этого и использовать стандарт IEEE-754 для вычислений, за исключением случаев где их просят этого не делать (gcc флаг -ffast-math). Вот пример кода:

#include <limits>
#include <cmath>
#include <iostream>

int main() {
double num;
std::cin >>num;
double mult = num / (pow(2, 54)) - 1;
double factor = 2;

if (fabs (mult - 1.) > std::numeric_limits::epsilon ()) {
factor *= mult;
}
std::cout << num << " " << mult << " " << (factor + 2) << std::endl;
}

Если скомпилировать с:
g++ -o math math.cc -ffast-math -O2

и передать в программу 1 то результат будет разный с этой проверкой и без неё.

Число передаётся как параметр, чтобы избежать оптимизации компилятора, который тогда всё сам посчитает.

С проверкой выдаёт 0, а без 1.11022e-16.

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

Состояние это да, но флешки тоже никуда не денутся какое-то время. Тут вопрос во внешнем мире и переферии, которая может поменяться. Состояние компьютера становится некой монадой как в хаскеле которая взаимодействует с внешним миром, который может неожиданно поменяться пока компьютер спит. Мышка была, а теперь на её месте клавиатура и тп. Система должна получать на уровне железа какой-то сигнал когда включается и заново сканировать и инициализировать всю переферию, отменяя все активные операции.

Пользователи ZFS плачут о том что больше не купить Optane - нет ничего лучше для SLOG.

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

Пусть суд Таганского района показывает рекламу. Деньги полученные на показ рекламы уже поделили по понятиям.

Формально верефицированную программу нужно компилировать формально проверенным компилятором, который скомпилирован формально проверенным компилятором...? Ещё нужно процессор небось формально verified и операционную систему при её наличии.

Ну или всё зависит от задачи?

С начала года Микрософт не делает никаких обновлений к Windows 7 (по заявлению Микрософта). А общая поддержка W7 закончилась ещё 8 лет назад.

Можно поднять виртуальную машину с Линукс и в нёй chrome :) И sandbox будет многослойный ;)

Не то чтобы я поддерживаю данную территорию, но это мог быть просто один из зондов, задача которого сфотографировать и взять пробы атмосферы и передать назад на основной корабль ;)

Я передаю целый USB порт - подключать и отключать можно что хочешь. Не очень известная опция: -device usb-host,hostbus=1,hostport=7,bus=usb.0

lsusb даст понять какие есть bus и port на хосте, а опцию bus можно убрать или поставить тот который у вас задан в VM

1
23 ...

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность