Проблема с большими числами FLOAT

Ну, хотя бы за превышение скорости - уж больно быстро шастает.

И за дискриминацию.

2 лайка

а дискриминация то в чём?

Российские суды разъяснят.

1 лайк

Оказалось есть еше более простой способ. Это целочисленное деление заменить на целочисленное умножение. А потом просто откинуть от результата лишние знаки.
Вот сам алгоритм.

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

2 лайка

Это не страшно. Заменяют ведь одни, а на голову падает другим.

так мы дойдём до того, что математики самые неразумные и жестокие существа на планете…

1 лайк

Ракеты и без таких ошибок на головы падают.
С другой стороны только дурак не делает ошибок.
Даже компания интел в своем процессоре сделала ошибку при умножении, а потом всем рассказывала как она героически ее исправила.
А самые неразумные это защитники окружающей среды. Они к празднику 9 мая решили выделить деньги на помощь людям, которые создают экологичекие катастрофы.
Не будем показывать пальцем, но во всем виноват Слоненок.

Нет, ну мне нравятся такие темы - название: “Проблема с большими числами FLOAT”, а потом оказывается, что ни вообще числа с плавающей точкой, ни конкретно float вообще не нужны.

Когда мы научимся правильно называть темы?

Ну да. вместо того, чтобы сказать как решить проблему с большими числами Float мне тут начали втирать что это сделать нельзя. А еще некоторые товарищи, не будем показывать на них пальцем см. пост 9 предложили арифметические действия заменить кучей условий:

if(M==16000613) { F=10000000.9}
else if(M==16000614) { F=10000000.3}
else { F=10000000.3}

А после таких ответов оказывается я тему неправильно назвал.
Видать у автора предыдущего сообщения хорошо проходило празднование нового года.
Ну да ладно. Если на форуме так принято, то я приму данный формат общения на форуме.

Во-первых, никакой проблемы с числами float нет - Вы сами ее придумали. А та особенность числе float, которую Вы называете проблемой, действительно неустранима (почему - я объяснял). Так что Вам сказали все правильно (если считаете, что “нет” - приведите пример “решения проблемы”).

А вариант:

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

1 лайк

Если кому интересно: пытался решить решить предложенную задачу на своём ноуте на Питоне. Считает флоат нормально: 10000000/30000000 = 0.333333333333333
но чтобы подсчитать все 60_000_000*16_000_000 = 960_000_000_000_000 значения функции методом рекурсии у меня не хватило памяти: result.append(r) MemoryError

""" Buldakov
https://forum.arduino.ru/t/problema-s-bolshimi-chislami-float/9487/6
unsigned long N,M;
Надо посчитать переменную
F=(float)(1.0*16_000_000/M)*N;
Если N=10000384 а M=16000613 то F=10000002.0
Если N=10000384 а M=16000614 то F=10000000.0
Если N=10000384 а M=16000615 то F=10000000.0 
Только N меняется в диапазоне от 1 до 60_000_000, а M меняется в диапазоне от 16_000_001 до 32_000_000.
PS C:\PycharmProjects\pythonRecursion> 60_000_000*16_000_000 = 960_000_000_000_000
PS C:\PycharmProjects\pythonRecursion> 10000000/30000000 = 0.333333333333333
"""
# This is a sample Python script.
### Pекурсия ###
def f5(m, n):
    return 16_000_000 / m * n
print(f5(10_000_384, 16_000_613)) # 25_599_997.760086015
print(f5(10000384, 16000614)) # 25_599_999.360024575
print(f5(10000384, 16000615)) # 25_600_000.95996314
k = 1
k1 = 16_000_001
result = []
for k in range(1, 60_000_001): #
    for k1 in range(16_000_001, 32_000_001):  #
        r = f5(k, k1)
        result.append(r) #  result.append(r) MemoryError
print(len(result)) #

unsigned long не может быть больше 4 294 967 295.
Нужно unsigned long long, тот до 18 446 744 073 709 551 615
Хотя питон я не знаю, могу и врать нещадно )))

в Питоне есть: int(), float(), str(), bool(). Фсё ооченно просто :smile:

https://mpmath.org/

Хоть 200 знакофф после точки. Или после запятой…

На столько ущербный язык? )

А в каком языке все задом наперёд писать нужно? Забыл название. Нельзя реализовать эту дичь?

В польском.

1 лайк

На 19

Чо, польский язык программирования есть?)))