Pull to refresh
0
0

User

Send message

Затем, что если один раз подбросить монетку и узреть орла, то нельзя утверждать, что вероятность выпадения орла равна 1.

Где конкретно вы предлагаете «поставить end» и какой «результат» мы узреем?

Нужен опрос к посту. Если одно из следующих утверждений верно, то проголосуйте за него:

  1. У вас есть двое детей — девочка и мальчик.

  2. У вас есть двое детей — обе девочки.

Ладно, а если так. Небольшой проверочный код:

uint32_t at_least_one_girl = 0;
uint32_t two_girls = 0;

for (uint32_t i = 1; i <= 1000; ++i)
{
    bool child_1_is_girl = is_girl();
    bool child_2_is_girl = is_girl();
    
    if (child_1_is_girl || child_2_is_girl)
    {
        ++at_least_one_girl;
        if (child_1_is_girl && child_2_is_girl)
            ++two_girls;
    }
}

Функция is_girl возвращает true с вероятностью 0.5. Проверяем, если хотя бы один ребёнок девочка, то наращиваем счётчик at_least_one_girl. Проверяем, если оба ребёнка девочки, то наращиваем счётчик two_girls. Повторяем процесс в цикле. После цикла смотрим чему равно отношение two_girls / at_least_one_girl.

Полный пример на C++ (ссылка на онлайн компилятор): https://coliru.stacked-crooked.com/a/b335d860188c732e

Вывод отношения two_girls / at_least_one_girl (probability) на разных итерациях цикла:

i:        100  probability: 0.409091
i:       1000  probability: 0.351978
i:      10000  probability: 0.334951
i:     100000  probability: 0.332387
i:    1000000  probability: 0.33353
i:   10000000  probability: 0.33342
i:  100000000  probability: 0.333332

Теперь чтобы понять, что такое точка, нам как минимум нужно знать, что есть множество, пустое множество, равенство множеств, объединение и пересечение множеств.

А вообще, странное определение. Пусть есть точка x, множество A = {x}, множества B = A и C = A. Тогда в соответствии с приведённым определением получаем, что множество A (состоящее из одной точки) имеет части.

Взгляните на определение прямой из аксиоматики Евклида:

  1. Точка есть то, что не имеет частей. («Точка есть то, часть чего ничто»)

  2. Линия — длина без ширины.

  3. Края же линии — точки.

  4. Прямая линия есть та, которая равно лежит на всех своих точках.

Определение прямой есть, оно использует такие понятия как «линия» и «точка», а ещё некое «равно лежит на». Вроде бы интуитивно понятно, но вообще говоря не плохо бы определить что означает «равно лежать».

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

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

Евклид решил прервать эту цепь рассуждений на этапе

Прямая линия есть та, которая равно лежит на всех своих точках.

Тогда что такое «линия, равно лежащая на всех своих точках»? Это «прямая» :)

Доводилось есть одну и ту же еду каждый день. Да, надоедает. Но стоит сменить рацион на несколько дней, и ощущение удовольствия от вроде бы надоевшей еды снова возвращается. Многие блюда как нравились мне 25 лет назад, так нравятся и сейчас.

Сон тут явно не удачный пример.

Потому что опровергает ваши утверждения?

С сексом всё тоже самое

То же самое как с едой и сном? Никогда не перестанет нравится, если иметь нестареющее тело?

Всё дело в том что жизнь не имеет смысла без смерти. Став бессмертным вы лишитесь всех удовольствий, будете влачить скучное серое существование

Это ваше предположение, и не более. Ведь экспериментов таких не было.

Он всё равно не будет интересоваться сексом и не будет любить как в первый раз, у него уже всё было.

Угу, и есть не будет хотеть, ибо уже когда-то ел; и спать не будет хотеть, ибо уже когда-то спал.

с тех пор фанта поменялаь? Вряд ли.

Так она на самом деле не поменялась или это не более чем ваше предположение?
Кстати, а что там с вкусовыми рецепторами? Такие же молодые как и 25 лет назад?

У вас же есть память!

Не самый надёжный источник.

Пусть произошли все ныне живущие люди от некоего общего предка, пусть совпадает ДНК на 99,9%. Это никак не отменяет биологические отличия, видимые невооружённым взглядом.

Так нет же таких признаков. Визуально Вы не отличите среднестатистического жителя центральной Африки от среднестатистического жителя России. Ведь «биологически отличий нет. Вообще.»

Но глобальное перемешивание народов размывает расовые признаки.

Что ещё за расовые признаки, если вы пишите, что биологически рас не существует?

Потому что в C пустые структуры на самом деле запрещены. What is the size of an empty struct in C?. Компиляция с опцией -pedantic выдаёт в gcc: warning: struct has no members, а в clang: warning: empty struct is a GNU extension.

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

Зачем вы транслируете этот форс абуза UB? Да и не только вы.

Затем, что использовать возможность языка, которая явным образом задокументированна, как приводящая к непредсказуемым последствиям — это баг, ошибка и саботаж.

В рассматриваемом коде нет получения indeterminate значения через evaluation

Чтение неинициализированной автоматической переменной при инициализации параметра функции и есть часть процесса evaluation. И в данном конкретном случае такое чтение вызывает неопределённое поведение. В стандарте даже есть схожий пример кода. basic.indet / Example 1:

unsigned char c;
unsigned char d = c;          // OK, d has an indeterminate value
int e = d;                    // undefined behavior

В неинициализированной локальной переменной значение не специфицированно, что всего лишь означает, что в ней, пусть и неизвестное, но одно из легальных значений, что для bool это true или false.

В черновике 17 стандарта есть даже сноска про то, что чтение неинициализированной bool переменной может вернуть нечто отличное от true и false. basic.fundamental / 50):

Using a bool value in ways described by this International Standard as “undefined”, such as by examining the value of an uninitialized automatic object, might cause it to behave as if it is neither true nor false.

Обсуждается ли возможность добавления restrict квалификатора или каких-нибудь аналогов?

Скорее даже хотелось бы иметь некоторую магическую функцию наподобие std::assume_aligned, которая бы сообщала компилятору, что переданные ей указатели / ссылки гарантированно ссылаются на неперекрывающиеся области памяти. Что-то вроде такого:

int val;

void foo(unsigned char* p1, unsigned char* p2, int& i1, int& i2)
{
    std::assume_no_alias(p1, p2, i1, i2, val);
    
    i2 = 1;
    p1[10] = p2[0];
    *p1 = i1;
    val = p2[10];
    i2 = 2;
}

В приведённом примере, после вызова функции std::assume_no_alias(p1, p2, i1, i2, val) компилятор мог бы быть уверен, что объекты i2, p1[10], p2[0], *p1, i1, val, p2[10] расположены в попарно неперекрывающихся областях памяти.

Данная функция особенно полезна была бы для указателей char*, для которых из-за опасности алиасинга компилятор вынужден генерировать менее производительный код. Пример: https://godbolt.org/z/PqWj61ePz

Если по адресу записываемому адресу на момент исполнения программы всегда живёт объект нужного типа, абсолютно валидно туда что-то писать.

Это не так. К сожалению, значение указателя определяется не только адресом, который хранит указатель, но и операциями, которые были совершены над данным конкретным указателем и областью памяти, адрес которой он хранит.

Например, функция realloc инвалидирует переданный ей указатель. И даже если realloc вернёт переданный ей адрес, исходный указатель всё равно считается невалидным. То есть хоть исходный указатель указывает на живой объект нужного типа, попытка достучаться к объекту через этот указатель вызывает неопределённое поведение.

Следующий код:

int* p1 = (int*)malloc(sizeof(int));
int* p2 = (int*)realloc(p1, sizeof(int));
    
if (p1 == p2)
{
    *p1 = 1;
    *p2 = 2;
    std::printf("%d %d \n", *p1, *p2);
    std::printf("%p %p \n", (const void*)p1, (const void*)p2);
}

Запросто может выдать следующий результат (https://godbolt.org/z/sK7nv9Y6x):

1 2 
0x2366eb0 0x2366eb0

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

Information

Rating
6,310-th
Registered
Activity