Почему я получаю специфичный для платформы результат для std :: exp? [Дубликат]

Мой ответ, собрав ответы других. Это должно исправить для отказа от компенсации числовых клавиш:

function array_to_xml($array, $root, $element) {
    $xml = new SimpleXMLElement("<{$root}/>");
    foreach ($array as $value) {
        $elem = $xml->addChild($element);
        xml_recurse_child($elem, $value);
    }
    return $xml;
}

function xml_recurse_child(&$node, $child) {
    foreach ($child as $key=>$value) {
        if(is_array($value)) {
            foreach ($value as $k => $v) {
                if(is_numeric($k)){
                    xml_recurse_child($node, array($key => $v));
                }
                else {
                    $subnode = $node->addChild($key);
                    xml_recurse_child($subnode, $value);
                }
            }
        }
        else {
            $node->addChild($key, $value);
        }
    }   
}

Функция array_to_xml() предполагает, что сначала массив состоит из числовых клавиш. Если у вашего массива был начальный элемент, вы бы сбросили инструкции foreach() и $elem из функции array_to_xml() и просто передали $xml.

6
задан jpo38 18 January 2019 в 09:12
поделиться

1 ответ

Стандарт не определяет, как должна быть реализована функция exp (или любая другая функция математической библиотеки 1 ), таким образом, каждая реализация библиотеки может использовать разные вычислительные методы.

Например, библиотека Android C ( bionic ) использует приближение exp (r) специальной рациональной функцией на интервале [0,0.34658] и сокращает результат. [ 117]

Вероятно, библиотека Microsoft использует другой вычислительный метод (не может найти информацию о нем), что приводит к другим результатам.

Кроме того, библиотеки могут использовать стратегию динамической загрузки (т.е. загрузить .dll, содержащую фактическую реализацию), чтобы использовать различные аппаратные специфические функции, что делает его еще более непредсказуемым, даже при использовании одного и того же компилятора. [ 119]

Чтобы получить одинаковую реализацию на обеих (всех) платформах, вы можете использовать собственную реализацию функции exp, не полагаясь на разные реализации разных библиотек.

Примите во внимание, что, возможно, процессоры используют разные подходы к округлению, что также привело бы к другому результату.

1 Есть некоторые исключения из них, например, функция sqrt или std :: fma и некоторые функции округления и базовая арифметика. операции

0
ответ дан LoPiTaL 18 January 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: