Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的浮点小数_Python_C++_Precision_Decimalformat_Arbitrary Precision - Fatal编程技术网

python中的浮点小数

python中的浮点小数,python,c++,precision,decimalformat,arbitrary-precision,Python,C++,Precision,Decimalformat,Arbitrary Precision,我有一个python脚本,其中定义了一个名为dt的变量,并将其初始化为:dt=0.30。由于某些特殊的原因,我不得不把我的Python脚本转换成C++程序,但是编写了两个程序来产生完全相同的结果。问题是结果在某个点开始偏离。我认为出现这个问题的原因是0.03在python中没有二进制浮点的精确表示;而在C++ dt=0.30 < /COD> 0.300000000000,Python输出到我的文件给出 dt=0.300000011921 < /C> >p> 我真正需要的是一种在Python中强

我有一个python脚本,其中定义了一个名为
dt
的变量,并将其初始化为:
dt=0.30
。由于某些特殊的原因,我不得不把我的Python脚本转换成C++程序,但是编写了两个程序来产生完全相同的结果。问题是结果在某个点开始偏离。我认为出现这个问题的原因是0.03在python中没有二进制浮点的精确表示;而在C++ <代码> dt=0.30 < /COD> 0.300000000000,Python输出到我的文件给出<代码> dt=0.300000011921 < /C> >p>
<>我真正需要的是一种在Python中强制<代码> dt=0.30 < /Cord>的方法,这样我就可以比较我的Python结果和C++代码,因为我相信它们之间的差别只是在这个小的差异中,这就造成了很大的差异。因此,我通过从decimal import*调用
,研究了python中的
decimal
算法,但是我不能将
dt
乘以任何浮点数(我需要在代码中进行计算)。有人知道一种不使用“十进制浮点”环境强制dt精确到0.30的简单方法吗?

我不知道您的上下文,但请尝试以下方法:

$ python
> from decimal import Decimal
> dt = Decimal('0.30')
> sum = Decimal(0)
> for _ in range(1000000000): sum += dt    
> sum
Decimal('30000000.00')
请注意,
Decimal
是用字符串调用的

例如,检查差异:

> Decimal(0.30)
Decimal('0.299999999999999988897769753748434595763683319091796875')
> Decimal('0.30')
Decimal('0.30')

我不了解您的上下文,但请尝试以下方法:

$ python
> from decimal import Decimal
> dt = Decimal('0.30')
> sum = Decimal(0)
> for _ in range(1000000000): sum += dt    
> sum
Decimal('30000000.00')
请注意,
Decimal
是用字符串调用的

例如,检查差异:

> Decimal(0.30)
Decimal('0.299999999999999988897769753748434595763683319091796875')
> Decimal('0.30')
Decimal('0.30')

如果您的C编译器的
printf
运行时支持十六进制浮点输出,那么下面是一个测试,您可以尝试查看文本转换函数之间的差异:

Python:

Python 2.7.10 (default, Aug 24 2015, 14:04:43)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = float(0.3)
>>> a.hex()
'0x1.3333333333333p-2'
C:

请注意,输出中的单位最后一位(ULP)相差1,Python生成的浮点看起来像IEEE双精度浮点

有轻微的ULP差异是正常的。它只是向您展示了运行库在转换浮点数和处理舍入方面的不同

或者,您可以在Python中打印十六进制浮点,并将它们用作C源代码中的常量:

#include <stdio.h>

int main(void)
{
  float y = 0x1.333334p-2;

  printf("%f\n", y);
  return 0;
}

如果您的C编译器的
printf
运行时支持十六进制浮点输出,那么下面是一个测试,您可以尝试查看文本转换函数之间的差异:

Python:

Python 2.7.10 (default, Aug 24 2015, 14:04:43)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = float(0.3)
>>> a.hex()
'0x1.3333333333333p-2'
C:

请注意,输出中的单位最后一位(ULP)相差1,Python生成的浮点看起来像IEEE双精度浮点

有轻微的ULP差异是正常的。它只是向您展示了运行库在转换浮点数和处理舍入方面的不同

或者,您可以在Python中打印十六进制浮点,并将它们用作C源代码中的常量:

#include <stdio.h>

int main(void)
{
  float y = 0x1.333334p-2;

  printf("%f\n", y);
  return 0;
}

它在任何以二进制值存储数据的系统上都没有精确的表示形式;)另请参见:如果Python实现的输出在您将其初始化为
dt=0.30
时显示为
dt=0.30000011291
,那么您正在做一些奇怪和错误的事情。在C++中,OP存储为<代码>浮点,而不是<代码>双?@ USSR43416:您的Python输出看起来像一个精确的浮点数,这是不可能的,除非你下载一个专门的库,比如NumPy,然后明确告诉它使用单精度。像
dt=0.30
这样的初始化不会发生这种情况。它在任何以二进制值存储数据的系统上都没有精确的表示形式;)另请参见:如果Python实现的输出在您将其初始化为
dt=0.30
时显示为
dt=0.30000011291
,那么您正在做一些奇怪和错误的事情。在C++中,OP存储为<代码>浮点,而不是<代码>双?@ USSR43416:您的Python输出看起来像一个精确的浮点数,这是不可能的,除非你下载一个专门的库,比如NumPy,然后明确告诉它使用单精度。像
dt=0.30
这样的初始化不会发生这种情况。我没有在gcc中尝试这个,尽管我怀疑它会起作用。我并没有尝试使用GCC,虽然我怀疑它会起作用。将所有的东西转换成代码>十进制< /代码>会使Python图形更精确,但它们仍然不匹配C++。好的捕捉,“我相信问题是因为Python中二进制浮点没有0.03的精确表示。错误地引导我使Python版本更准确。将所有的东西转换成代码>十进制< /代码>将使Python图形更精确,但它们仍然不匹配C++的。好的捕捉,“我相信问题是因为Python中二进制浮点中没有0.03的精确表示的事实而发生的。”错误地引导我使python版本更加准确。