Я не проверял это, но, вероятно, интерфейс C ++ python сохранит double
s, просто скопировав двоичное изображение, которое они представляют (64-битное изображение), поскольку, скорее всего, оба языка используют одно и то же внутреннее представление двоичного плавающего числа с запятой (двоичный 64-битный формат IEEE-754) У этого есть одна причина: оба используют сопроцессор с плавающей запятой для работы с ними, и это формат, который требуется для передачи чисел.
Возникает один вопрос по этому поводу, поскольку вы не говорите: Как вы определили, что вы теряете точность данных? Проверяли ли вы только разные десятичные цифры? Или вы экспортировали реальный двоичный формат, чтобы проверить различия в битовых шаблонах? Распространенной ошибкой является вывод обоих чисел, скажем, с 20
значащими цифрами, а затем наблюдение за различиями в последних двух или трех цифрах. Это потому, что вы не можете познакомиться с тем, что double
s, представленные таким образом (в двоичном формате IEEE-752), имеют только около 17 значащих цифр (это зависит от числа, но вы можете иметь различия в di git 17-й или более поздний, это потому, что числа закодированы в двоичном формате)
Я настоятельно не рекомендую вам преобразовывать эти числа в десятичное представление и отправлять их как строки ascii. Вы потеряете некоторую точность (в виде ошибок округления, см. Ниже) в кодировании, а затем снова на этапе декодирования в python. Подумайте, что преобразование (даже с максимальной точностью) двоичного числа с плавающей запятой в десятичное, а затем обратно в двоичное - это почти всегда процесс потери информации. Проблема в том, что число, которое может быть представлено точно в десятичном виде (например, 0.1
), не может быть представлено точно в двоичной форме (вы получаете бесконечную повторяющуюся последовательность с периодом c, как если бы вы делили 1.0
на 3.0
в decimal, вы получите неточный результат) Противоположное преобразование отличается, так как вы всегда можете преобразовать конечное десятичное двоичное число в конечное десятичное число с основанием десять, , но не в пределах 53 бит - что является количество бит, выделенных для мантиссы в 64-битных числах с плавающей запятой)
Итак, мой совет - перепроверить, где ваши числа показывают различия, и сравнить с тем, что я говорю здесь (если числа показывают различия в di git позиции после 16-го десятичного числа di git, эти различия в порядке --- они должны делать только с различными алгоритмами, используемыми библиотекой C ++ и python библиотекой для преобразования чисел в десятичный формат ) Если до этого возникнут различия, проверьте, как представлены числа с плавающей запятой в python, или проверьте, теряете ли вы в какой-то момент точность, сохраняя эти числа в переменной с одинарной точностью float
(это чаще, чем обычно оценивается), и посмотрите, есть ли какая-то разница (я не верю, что будет) в форматы, используемые обеими средами. Кстати, отображение таких различий в вашем вопросе должно быть плюсом (что вы также не сделали), поскольку мы могли бы сказать вам, нормальны ли наблюдаемые вами различия или нет.