如何在Python中强制对减法进行签名?

如何在Python中强制对减法进行签名?,python,sign,subtraction,uint,Python,Sign,Subtraction,Uint,如果你不在乎背景,你可以跳到底线: 我有以下Python代码: ratio = (point.threshold - self.points[0].value) / (self.points[1].value - self.points[0].value) 这给了我错误的值。例如: threshold: 25.0 self.points[0].value: 46 self.points[1].value: 21 我得到: ratio: -0.000320556853048 这是错误

如果你不在乎背景,你可以跳到底线:

我有以下Python代码:

ratio = (point.threshold - self.points[0].value) / (self.points[1].value - self.points[0].value)
这给了我错误的值。例如:

threshold:  25.0
self.points[0].value:  46
self.points[1].value:  21
我得到:

ratio:  -0.000320556853048
这是错误的

查看后,我发现
self.points[0].value
self.points[1].value]属于
numpy.uint16`类型,因此我得到:

21 - 46 = 65511
而我从未为
point.threshold
定义过类型。我刚刚分配的。我想它有一个普通的
int

底线
如何强制对两个
uint
s的减法进行签名?

好吧,显而易见的解决方案可能是将其转换为浮点数:

ratio = (float(point.threshold) - float(self.points[0].value)) / (float(self.points[1].value) - float(self.points[0].value))

或者我想您可以强制转换为一种numpy签名类型。

那么,显而易见的解决方案可能是强制转换为float:

ratio = (float(point.threshold) - float(self.points[0].value)) / (float(self.points[1].value) - float(self.points[0].value))

或者我想您可以将其转换为一种numpy符号类型。

几乎任何东西但是uint在这里都有效,所以在执行减法之前,只需将其转换为其他类型即可


因为threshold=25.0(注意小数点),它是一个浮点,所以只要不使用uint,减法和除法都可以工作。

几乎任何东西但是uint在这里都可以工作,所以在进行减法之前,只需将它们转换为其他对象即可


因为threshold=25.0(注意小数点),它是一个浮点,所以只要不使用uint,减法和除法都可以工作。

这些值实际上需要uint16而不是int16吗?除非它们必须能够获取
2**15
或更高的值(但仍然低于
2**16
),否则您可以简单地将它们保留为int16并使用它——正如您所发现的,未签名的int可能很棘手(不仅仅是在numpy;-)。如果您确实需要uint16,那么按照David的建议进行强制转换是可行的,但是如果您可以简单地使用int16,它将更快、更可读


顺便说一句,这看起来像是一个点。threshold是一个浮点,而不是int(这也是一件好事,否则这种除法的编码方式将是一种截断除法,除非您从将来导入真正的除法,这在许多Python的
2.*
版本中都得到了支持,这也是除法在
3.
中的最终工作方式)。
25.0
中的
.0
给出了它,并显示它是一个浮点,而不是一个整数。

这些值实际上需要是uint16而不是int16吗?除非它们必须能够获取
2**15
或更高的值(但仍然低于
2**16
),否则您可以简单地将它们保留为int16并使用它——正如您所发现的,未签名的int可能很棘手(不仅仅是在numpy;-)。如果您确实需要uint16,那么按照David的建议进行强制转换是可行的,但是如果您可以简单地使用int16,它将更快、更可读


顺便说一句,这看起来像是一个点。threshold是一个浮点,而不是int(这也是一件好事,否则这种除法的编码方式将是一种截断除法,除非您从将来导入真正的除法,这在许多Python的
2.*
版本中都得到了支持,这也是除法在
3.
中的最终工作方式)。
25.0
中的
.0
给出了它,并显示它是一个浮点,而不是一个整数。

我正在从二进制文件读取数据,其中的数据是uint16格式的。我从未来导入了真除法,但它们是否需要无符号,也就是说,它们是否实际取值介于
2**15
2**16
之间?否则,无符号整数的二进制格式和有符号整数的二进制格式没有区别。我正在从二进制文件读取数据,其中的数据是uint16格式。我从未来导入了真除法,但它们是否需要无符号,也就是说,它们是否实际取值介于
2**15
2**16
之间?否则,无符号整数和有符号整数的二进制格式没有区别。