Python 在MATLAB中实现双精度到单精度的转换

Python 在MATLAB中实现双精度到单精度的转换,python,matlab,cuda,double,Python,Matlab,Cuda,Double,我认为这是不可能的,所以我决定在这里问一下,因为谷歌搜索并没有返回任何提示我可以这样做的结果 特别是读了这篇文章之后: 虽然我的数字可以保存在32位,如下例所示 但是,在MATLAB中有没有任何方法可以在不丢失信息的情况下将双精度值转换为单精度值 e、 g.在MATLAB中 > a = 103364148 a = 103364148 > single(a) ans = 103364144 或者在另一种语言中有另一种方法,例如Python 我正在使用GPUMat,在那里

我认为这是不可能的,所以我决定在这里问一下,因为谷歌搜索并没有返回任何提示我可以这样做的结果

特别是读了这篇文章之后:

虽然我的数字可以保存在32位,如下例所示

但是,在MATLAB中有没有任何方法可以在不丢失信息的情况下将双精度值转换为单精度值

e、 g.在MATLAB中

> a = 103364148
a =
   103364148
> single(a)
ans =
   103364144
或者在另一种语言中有另一种方法,例如Python

我正在使用GPUMat,在那里我只能使用GPUSingle,所以我试图找到一种方法来处理那些与MATLAB双倍于GPU的东西


多亏了,

一个单数可以保存最多2^24(16777216)的整数,而不会丢失精度-符号和指数需要一些位

换言之,不,你不可能让一个大于2^24的数字在一个单数中不出错(请注意,它可以容纳一些较大的数字,只要它们可以写成一个小于2^24的数字和一些2的幂的乘积)


但是,您确定您的计算需要这种精度吗?只要所有整数都小于2^24,就可以了。

一个整数最多可以容纳2^24(16777216)个整数,而不会丢失精度-符号和指数需要一些位

换言之,不,你不可能让一个大于2^24的数字在一个单数中不出错(请注意,它可以容纳一些较大的数字,只要它们可以写成一个小于2^24的数字和一些2的幂的乘积)


但是,您确定您的计算需要这种精度吗?只要你所有的整数都小于2^24,你就可以了。

如果你唯一关心的是整数,你可以用int32来代替

如果你唯一关心的是整数,你可以用int32来代替

当你做这些类型的实验时,你应该打开

format long
因此,您可以看到更多的十进制值。比如说,

>> pi     
ans =
    3.1416
>> format long
>> ans
ans =
   3.141592653589793

当你做这些实验时,你应该打开

format long
因此,您可以看到更多的十进制值。比如说,

>> pi     
ans =
    3.1416
>> format long
>> ans
ans =
   3.141592653589793


双人床比单人床大。当然,你会失去精度,除非你恰好在这两个部分的范围内。这个问题听起来像是“如何将最多30个字符放入一个长度为15的字符串中”?是的,您可以像示例中所示将数字保留在32位,但输出的数字不同。但我认为
103364148
在该范围内?因为32位是
− 2147483648到2147483647
?@robert那么有没有办法让它得出相同的数字呢?谢谢。一个整数有32位来存储数字,所以是的,你可以把它放在这个范围内。单个浮点数有23位存储数字,1位存储符号,8位存储指数。Matlab使用浮点和双精度,而不是整数。双精度大于单精度。当然,你会失去精度,除非你恰好在这两个部分的范围内。这个问题听起来像是“如何将最多30个字符放入一个长度为15的字符串中”?是的,您可以像示例中所示将数字保留在32位,但输出的数字不同。但我认为
103364148
在该范围内?因为32位是
− 2147483648到2147483647
?@robert那么有没有办法让它得出相同的数字呢?谢谢。一个整数有32位来存储数字,所以是的,你可以把它放在这个范围内。单个浮点数有23位存储数字,1位存储符号,8位存储指数。Matlab使用浮点和双精度,而不是整数。因此,我尝试将其从双精度转换为单精度,因为数组中的所有数字都少于1000万左右,没有符号和小数,只有整数。@eWizardII:那么,听起来这就是你的答案。如果只有小于2^24的整数值,则可以使用函数和@gnovice来回转换它们,而不会降低精度。那么为什么在上面的示例中这不起作用呢?如果使用
double(103364144)
您仍然会得到
103364144
Thanks@eWizardII:因为103364144远大于2^24(即16777216,单整数可以有效覆盖的最大整数范围)。使用逗号更容易看到。;)但是,double可以容纳最大为2^53的所有整数。@gnovice:谢谢您的支持。我将为你们美国人添加逗号:)我不这样做,所以我尝试将它从双精度转换为单精度,因为数组中的所有数字都不到1000万左右,没有符号和小数,只有整数。@Eizardii:那么,听起来这就是你的答案。如果只有小于2^24的整数值,则可以使用函数和@gnovice来回转换它们,而不会降低精度。那么为什么在上面的示例中这不起作用呢?如果使用
double(103364144)
您仍然会得到
103364144
Thanks@eWizardII:因为103364144远大于2^24(即16777216,单整数可以有效覆盖的最大整数范围)。使用逗号更容易看到。;)但是,double可以容纳最大为2^53的所有整数。@gnovice:谢谢您的支持。我将为你们美国人添加逗号:)不幸的是,GPUMat似乎不支持int32。是的,唯一的问题是因为它的单精度不适合,见上文。是的,只有GPUdouble和GUPsingle。不幸的是,GPUMat似乎不支持int32。是的,唯一的问题是因为它的单精度不适合,见上文。是的,仅限于GPUdouble和GUPsingle。