5 #include "src/builtins/builtins-utils.h" 6 #include "src/builtins/builtins.h" 7 #include "src/counters.h" 8 #include "src/objects-inl.h" 18 HandleScope scope(isolate);
19 int const length = args.length() - 1;
20 if (length == 0)
return Smi::kZero;
23 bool one_arg_is_nan =
false;
24 std::vector<double> abs_values;
25 abs_values.reserve(length);
26 for (
int i = 0;
i < length;
i++) {
27 Handle<Object> x = args.at(
i + 1);
28 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x,
29 Object::ToNumber(isolate, x));
30 double abs_value = std::abs(x->Number());
32 if (std::isnan(abs_value)) {
33 one_arg_is_nan =
true;
35 abs_values.push_back(abs_value);
36 if (max < abs_value) {
42 if (max == V8_INFINITY) {
43 return *isolate->factory()->NewNumber(V8_INFINITY);
47 return ReadOnlyRoots(isolate).nan_value();
58 double compensation = 0;
59 for (
int i = 0;
i < length;
i++) {
60 double n = abs_values[
i] / max;
61 double summand = n * n - compensation;
62 double preliminary = sum + summand;
63 compensation = (preliminary - sum) - summand;
67 return *isolate->factory()->NewNumber(std::sqrt(sum) * max);