Задать вопрос
  • Как корректно проверить математическую формулу?

    hint000
    @hint000
    у админа три руки
    достаточно ли будет, если я прогоню каждый коэффициент по 1 разу
    Тут нет общего ответа. Иногда можно срезать углы, иногда нельзя.
    предположим xyz=c
    Тогда срезайте, если уверены, что кроме этой формулы больше нигде не используются x,y,z. Тут при вещественных переменных особо важен тест на минимальное положительное значение c (при целых не обязательно), а на максимальное - хоть при вещественных, хоть при целых. На нулевые и на отрицательные значения, если попадают в разрешенный диапазон. И типа всё (срезали лишнее).

    А предположим, что 1/(x+y-z+4)=c, а у вас случайно не будет теста x=1, y=1, z=6 (или аналогичного), который обязан зафейлиться (на целых).
    "А-а-а? Э-э-э!" (с)

    А если у нас задача про землекопов, и в ответе получилось 1.49999 землекопа?
    А если в той же задаче получилось 1.99999 землекопа? С точки зрения тестирования это две принципиально разные выявленные ошибки в программе. В первом случае ошибка в формуле, во втором случае потеря точности.

    Необходимость тех или иных тестов можно понять только когда известны зависимости, известны диапазоны, известна логика программы (что и для чего мы вычисляем, какой смысл несёт результат работы программы). Если всего этого не знать, то будет по принципу GIGO - garbage in, garbage out - бесполезная работа.
    Ответ написан
    3 комментария
  • Как корректно проверить математическую формулу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Например x1y1z1=c1, а x2y2z2=c2


    Вы не можете проверить саму формулу. Ее смысл не вытекает ниоткуда. По краейней мере для вас.
    Об этом писал Курт Гёдель. Формула корректна потому что она нам дана таковой.

    Но вы можете как тестировщик проверить ее реализацию. Обычными тестами или тестами свойств.
    Property-Based-Testing (PBT)

    Для PBT обычно вы подаете на вход рандомные значения и проверяете что выполняется какой-то
    инвариант. Например если формула дает площать фигуры - то площать всегда не отрицательная.
    Или Например если это площать круга - то она всегда будет меньше например площади
    описанного квадрата. Это грубая проверка но она позволяет по крайней мере очень быстро
    доказать что нет грубой ошибки.

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

    Если типы данных у вас - вещественные то все формулы в тестировании проверяются не на точное
    совпадение а с допуском (эпсилон) который вы описываете в asserts:

    assert ( x * y * z == c, ε = 0.000001 )

    для всей области определения x,y,z

    В качестве фреймворков для Java/Scala есть соотвественно jqwik, scalacheck
    Ответ написан
    2 комментария