-3

Как умножить 2 float числа не используя знак умножения?

Числа могут быть любые.

let a = 0.1;
let b = 0.2;
Serge88
  • 418
  • math.multiply(a, b) – xmikex Nov 07 '21 at 15:07
  • 2
    Почему до сих пор никто не задал вопрос — нафига? – Alexey Ten Nov 07 '21 at 15:46
  • Почему никто не задал вопрос - а как в школе столбиком перемножали с использованием таблицы умножения? Компьютер по волшебству умножение производит? Составьте таблицу умножения, держите в уме десятки, складывайте. А так вы только синтаксис меняете. Вместо таблицы можно складывать соответствующую цифру необходимое количество раз)) – Leonid Nov 07 '21 at 15:51
  • @AlexeyTen, судя по комментариям, автор вопроса просто хочет получить в результате умножения ровно 0.02, а не 0.020000000000000004... – wololo Nov 07 '21 at 15:57
  • Если надо получить "точные" результаты при операциях с числами, то не используйте float. Целые числа позволяют хранить количество молекул на Земле. Переводите метры в миллиметры или нанометры, все расчеты производите в этих единицах, а при выводе преобразовывайте как надо. Это вам не математика, это реальный мир. – Leonid Nov 07 '21 at 16:05
  • @wololo как там Ксанф говорил, как только автор предоставит точные числа 0.1 и 0.2 – Alexey Ten Nov 07 '21 at 16:18

2 Answers2

3

Способов несколько

  1. использование деления

     const res = a / (1 / b);
    

Способ универсальный по сравнению со способом 2), НЕДОСТАТОК - если b = 0, то способ не работает

  1. используя логарифмы и экспоненту

     const res = Math.exp(Math.log(a) + Math.log(b))
    

2.1) аналогично 2, но можно использовать степень и логарифм по основанию 10:

    const res = Math.pow(10, Math.log10(a) + Math.log10(b))

2.2) аналогично 2, но можно использовать степень и логарифм по основанию 2:

    const res = Math.pow(2, Math.log2(a) + Math.log2(b))

вообще тут можно много вариантов с логарифмами привести, ведь можно использовать и логарифм с произвольным основанием

Но есть НЕДОСТАТОК - невозможно работать с отрицательными числами и 0

  1. использовать тангенсы:

любое число можно представить как тангенс угла a = tan(x), поэтому можно воспользоваться тригонометрическим тождеством:

tan(x + y) = (tan(x) + tan(y)) / (1 - tan(x)*tan(y))

таким образом можно получить

1 - (a + b) / (tan(atan(a) + atan(b)) = a * b

т.е.

res = 1 - (a + b) / (Math.tan(Math.atan(a) + Math.atan(b))

НЕДОСТАТОЕ: вариант, когда tan(atan(a) + atan(b) = 0 ну и опять из-за того, что функции высчитываются через ряды плывет точность (чтуь-чуть)

Zhihar
  • 37,513
  • Только первый вариант console.log( res = a / (1 / b) ); вывел правильно 0.02 остальные 0.02 с хвостиком выводят 0.020000000000000004 – Serge88 Nov 07 '21 at 15:00
  • 1
    ну это проблема сложных функций :) - ошибки при вычислении рядов, погрешности – Zhihar Nov 07 '21 at 15:01
  • я знаю)) вот пытаюсь найти универсальное решение, везде пишут что это и про что это, а как конкретно решить это никто не знает – Serge88 Nov 07 '21 at 15:03
  • универсальное решение для произведения без умножения? – Zhihar Nov 07 '21 at 15:04
  • можно с умножением, самое главное чтобы точность вычисления была на 100%, float со всеми знаками * / + - – Serge88 Nov 07 '21 at 15:05
  • 1
    @Serge88, вывел правильно 0.02 Почему вы думаете, что это правильный ответ? Просто выведите чуть больше знаков: (0.1*0.2).toFixed(20). А вообще, см.: Вычисления на числах с плавающей точкой не работают. – wololo Nov 07 '21 at 15:08
  • добавил 3 способ для особых извращенцев :) по поводу точности - почитайте как устроены числа float - из-за того, что log(2) / log(10) - это иррациональное число, то чаще всего вы не сможете на компьютере получать действительные числа, соответствующие их десятичной записи – Zhihar Nov 07 '21 at 15:10
1
exp(ln(a) + ln(b))

Тело сообщения должно содержать не менее 30 символов; вы ввели 19.

  • Подскажите пожалуйста что я делаю не так, у меня выводит ошибку "ReferenceError: exp is not defined" – Serge88 Nov 07 '21 at 14:44
  • @Serge88 https://www.google.com/search?q=javascript+exp&rlz=1C1GCEU_enUS847CA847&oq=javascript+exp&aqs=chrome..69i57j0i512l9.5004j0j15&sourceid=chrome&ie=UTF-8 –  Nov 07 '21 at 14:46
  • console.log( Math.exp(ln(a) + ln(b)) ); так тоже почему то выдает ошибку ReferenceError: ln is not defined – Serge88 Nov 07 '21 at 14:50
  • 1
    @Serge88 https://www.google.com/search?q=javascript+ln&rlz=1C1OKWM_enCA854CA854&oq=javascript+ln&aqs=chrome..69i57j0i512j0i22i30j0i10i22i30l2j0i22i30j0i10i22i30l4.4589j0j7&sourceid=chrome&ie=UTF-8 - замечаете тенденцию? –  Nov 07 '21 at 14:53
  • Написал так console.log( Math.exp(Math.log(a) + Math.log(b)) ); но выводит почему то 0.02000000000000001 а должен 0.02 – Serge88 Nov 07 '21 at 14:55
  • toFixed не подойдет, так как неизвестно насколько обрезать – Serge88 Nov 07 '21 at 14:56
  • @Serge88 .toFixed(15) –  Nov 07 '21 at 15:00