Dan*_*Dan 5 c c++ python google-app-engine gnu
GNU C库具有该功能drem(别名remainder).
如何使用Google App Engine Python 2.7运行时支持的模块来模拟此功能?
从GNU手册为drem:
这些函数类似于
fmod它们将内部商n舍入到最接近的整数而不是零到整数.例如,drem(6.5,2.3)返回-0.4,即6.5减6.9.
从GNU手册为fmod:
这些函数通过分母从分子的除法计算余数.具体来说,返回值是分子 - n*分母,其中n是分子除以分母的商,向零四舍五入为整数.因此,fmod(6.5,2.3)返回1.9,即6.5减去4.6.
阅读文档,以下Python代码应该有效:
def drem(x, y):
n = round(x / y)
return x - n * y
Run Code Online (Sandbox Code Playgroud)
但是使用Python drem(1.0, 2.0) == -1.0和C语言drem(1.0, 2.0) == 1.0.注意Python返回负数,C返回正数.这几乎可以肯定是圆形浮子的内部差异.据我所知,两个函数执行相同的其他参数2 * x != y.
如何使我的Python drem函数与其C等效函数相同?
解决这个问题的关键是要意识到drem/ remainder 函数规范要求内部舍入计算舍入到一半.
因此,我们不能round在Python 2.x中使用内置函数,因为它从0 round开始舍入.然而,Python 3.x中的函数已经改为舍入到一半.所以下面的Python 3.x代码将等同于GNU C库drem函数,但在Python 2.x中不起作用:
def drem(x, y):
n = round(x / y)
return x - n * y
Run Code Online (Sandbox Code Playgroud)
为了实现与Python 2.x相同,我们可以使用decimal模块及其remainder_near函数:
import decimal
def drem(x, y):
xd = decimal.Decimal(x)
yd = decimal.Decimal(y)
return float(xd.remainder_near(yd))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |