Функция в качестве аргумента функции. JavaScript

79
18 июня 2021, 15:30

Я изучаю JavaScript, купил для этого книги. И вот дошел к разделу "Функции в качестве аргумента другой функции". Помимо небольшого параграфа с объяснениями, был вот такой листинг, который я не до конца понял. Я начал разбирать его буквально на листе бумаги, пытаясь понять как получается конечный результат. Но возникли вопросы, которые я попытался выразить в комментариях кода. Заранее спасибо за ответ.

// Мы задаём в качестве аргумента x значение z. => x == z 
function diff(f, x, dx) { 
  return (f(x + dx) - f(x)) / dx; // x = z = 1, dx = 0,001 (аргумент функции). (1 + 0,001 - 1) / 0,001  
  // результат = 1 
} 
 
function G(x) { //  результат = x в этой функции = 1 
  return x * x + x; // 1 * 1 + 1 = 2 
} 
 
function g(x) { // это не трогаем, это для сравнения 
  return 2 * x + 1; 
} 
document.write("<h4>Вычисление производной</h4>") 
var z = 1; 
document.write(g(z) + " vs " + diff(G, z, 0.001) + "<br>"); // по результату расчетов, g(x) = 3, G(x) = 2 
// а результат в браузере такой: g(x) = 3 G(x) = 3.0009999999993653 
// у меня претензии и не понимание в уравнении (f(x + dx) - f(x))/dx. Какое бы значение z не имела бы, 
// результат этой функции будет всегда 1. Почему? x и -x из уравнения сократим, а 0,001/0,001 = 1 
// но результат в браузере совсем иначий. Как так происходит? Где я ошибаюсь?

Answer 1

var z = 1; 
console.log( g(z) + " vs " + diff(G, z, 0.001) );  
 
function diff(f, x, dx) { 
  return (f(x + dx) - f(x)) / dx; 
  /*    G(1 + 0.001) 
             ↓ 
        G( 1.001 ) → 1.001 * 1.001 + 1.001 == 2.003001 
  минус G( 1 )     → 1 * 1 + 1             == 2 
       
      На выходе должно быть (2.003001 - 2) / 0.001  
      На калькуляторе - одно, а в JS - будет другое. 
      Поэтому точные вычисления не делаются на JS 
   */ 
} 
 
console.log( (2.003001 - 2) / 0.001 ); 
 
function G(x) { 
  return x * x + x;  
} 
 
function g(x) {  
  return 2 * x + 1; 
}

Можно найти много чего интересного по запросу 0.1 + 0.2 javascript ))
Но достаточно знать, что возможны незначительные косяки при вычислениях, если есть нецелые числа. И перед окончательным выводом результата, дополнительно округлять его для страховки. А c точным вычислениями - уже не к JS)

READ ALSO
Как сделать из изображения 1x1 &gt; 4x3?

Как сделать из изображения 1x1 > 4x3?

Видел такое решение в некоторых интернет-магазинах: для изображения добавляется контейнер, при вставке изображения в контейнер оно растягивается...

109
Как правильно подключать шрифты CSS?

Как правильно подключать шрифты CSS?

Дан файл к примеру JosefinSans-SemiBoldeot

184
OpenVINO API &amp; samples

OpenVINO API & samples

Есть такая библиотека OpenVINO от Intel, предназначена для работы с нейронными сетями

96