Я пытаюсь реплицировать некоторый код на основе C ++ в Python API Tensorflow, но у меня мало проблем с плавающей запятой, хотя мне удалось найти одну из них.
Как правило, Tensorflowкажется, округляет десятичные дроби округлить наполовину вниз способом, это означает, что если у нас есть целое число с дробным значением, точно равным 0.5
, интегральная часть этого десятичного числа будет округлена до нуля:
>>> import tensorflow as tf
>>> tf.Session().run(tf.math.round(2.5))
2.0
тогда как многие императивные языки программирования, с которыми я сталкивался, выполняют округление с округлением до половины .Некоторые из этих языков программирования: C ++ и Python .
На самом деле, учитывая, что Tensorflow в основном написан на C ++, Python и Cuda C ++, для них кажется странным соглашением использовать метод rounding half down
для своих функций в API.
Вопрос :
Есть ли какой-нибудь удобный способ реализовать функцию округления, которая использует метод rounding half up
вместо rounding half down
?
Простейшая функция, которую я мог реализовать, использует метод tf.floormod
:
>>> def classical_round(x): return tf.cond(tf.math.equal(tf.floormod(x, 1), tf.constant(0.5)), lambda: tf.math.ceil(x), lambda: tf.math.round(x))
...
>>> tf.Session().run(classical_round(4.5))
5.0
>>> tf.Session().run(classical_round(4.49))
4.0
>>> tf.Session().run(classical_round(4.49999999999999))
5.0
>>> tf.Session().run(classical_round(3.2))
3.0
Это достаточно точный метод?или что-то подобное можно сделать с помощью других операций с тензорным потоком?
Research :
Я мог только найти эту проблему Github , относящуюся к моей проблеме,Я думаю, что они закончили тем, что добавили tf.math.rint
, для которого я не мог найти место в этой проблеме.
Спасибо!