Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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_Divide By Zero - Fatal编程技术网

Python 我能可靠地生成的最小非零数是多少?

Python 我能可靠地生成的最小非零数是多少?,python,c,divide-by-zero,Python,C,Divide By Zero,我正在做一些绘图类型的东西,我经常想把两点之间的斜率取为dy/dx。然而,如果我的dx正好为零,我将得到一个被零除的错误 如果dx为零,我可以将它设置为较小的值,比如0.001。但是,我想提高我的解决方案的准确性 对于这个给定的问题,可能会有更好的解决方案,但我确信其他问题也存在,它们可能的解决方案要求相同的东西:最小可能的非零数 另外,获得这些服务的费用有多高?这一数字是否有很大可能无法可靠复制,比如说,可能是由于舍入误差 我在做一些绘图类的东西 然后考虑学习(灵感)源代码。它是。。。。还可以

我正在做一些绘图类型的东西,我经常想把两点之间的斜率取为dy/dx。然而,如果我的dx正好为零,我将得到一个被零除的错误

如果dx为零,我可以将它设置为较小的值,比如0.001。但是,我想提高我的解决方案的准确性

对于这个给定的问题,可能会有更好的解决方案,但我确信其他问题也存在,它们可能的解决方案要求相同的东西:最小可能的非零数

另外,获得这些服务的费用有多高?这一数字是否有很大可能无法可靠复制,比如说,可能是由于舍入误差

我在做一些绘图类的东西

然后考虑学习(灵感)源代码。它是。。。。还可以查看的源代码内部。是的

我能可靠地生成的最小非零数是多少

理论上,这可能是特定于编译器的,也可能是特定于实现的

C标准草案在§5.2.4.2.2中提到了一些
DBL_EPSILON
macro

如果(dy==0.0)返回,我建议显式地编码
因为在当前的计算机上,速度非常快。实际上,一个类似于
if(fabs(dy)的测试,你能用这个模块来实现吗?你可以用它来生成一个非常小的固定浮点值:

import decimal
from decimal import Decimal

>>> almost_zero = Decimal((0, (1,), decimal.getcontext().Emin))
>>> almost_zero
Decimal('1E-999999')
这是一个非常小的数字,应该适合你的目的

>>> 1 / almost_zero
Decimal('1E+999999')
或者你也可以从中找出一些东西


下面是一个可以帮助您获得所需值的程序。这些值都是在文件
中定义的常量,并描述了诸如
浮点数
双精度
使用的位数等常量,以及您可以在程序中使用的最大值和最小值

DBL\u MIN
DBL\u TRUE\u MIN
DBL\u EPSILON
应该得到一些解释。你应该阅读有关浮点二进制数的标准IEEE 754。第一个是可以用全精度表示的最小值,在这种情况下,你可以继续表示数字,但它们会失去越来越多的精度直到在
DBL\u TRUE\u MIN
中只生成一位,这是机器中可表示的最小值。但在我看来,您要查找的是
DBL\u EPSILON
,它是浮点数中两个连续数字之间存在的间隔。由于浮点数是相对大小,因此它作为差值给出差异是指
1.0
1.0
后面的下一个数字,这意味着数字不能比这个更接近(你需要将这个
*\u EPSILON
乘以提供刻度的数字,以得出在该刻度上一个数字到下一个数字的距离

提供这些值的程序如下所示:

#include <stdio.h>
#include <float.h>

#define P(_nam,_fmt) printf("%20s = "_fmt"\n", #_nam, _nam)

int main()
{
        P(FLT_DIG,     "%18d");
        P(FLT_MAX,     "%18.6g");
        P(FLT_EPSILON, "%18.6g");
        P(FLT_MIN,     "%18.6g");
#if FLT_HAS_SUBNORM
        P(FLT_TRUE_MIN,"%18.2g");
#endif
        puts("");
        P(DBL_DIG,     "%18d");
        P(DBL_MAX,     "%18.15lg");
        P(DBL_EPSILON, "%18.15lg");
        P(DBL_MIN,     "%18.15lg");
#if DBL_HAS_SUBNORM
        P(DBL_TRUE_MIN,"%18.2lg");
#endif
}

我认为这是一个问题,我怀疑你是否可以使用最小的非zeero数来达到你想要的目的。你真正想要的是最小的数,你仍然可以用它来计算一个有意义的斜率。但是对于零的delta x,如果它存在的话,有一个有意义的斜率,它是“垂直的”.所以我认为你真正应该做的是使用语义上的“垂直”对于任何0-deltax,不要将deltax更改为只会给您带来表面上有意义的坡度。如何做到这一点当然是一个不同的问题。请更详细地描述您的背景。然后,我们可以为您的需要寻找解决方案,而不是帮助您强行走上最后一条可能是死路的道路w、 为什么这同时标记了C和Python?它们的浮点类型是不等价的。你在寻找哪种语言的特定类型?你知道Python也有任意精度的rational类型吗?Mistermiagi,不,我不知道!我想知道每种语言的答案。Yunnosch,我不是在寻找一个特定问题的解决方案。我这样问是为了更好地解决未来的问题。没有死胡同。
#include <stdio.h>
#include <float.h>

#define P(_nam,_fmt) printf("%20s = "_fmt"\n", #_nam, _nam)

int main()
{
        P(FLT_DIG,     "%18d");
        P(FLT_MAX,     "%18.6g");
        P(FLT_EPSILON, "%18.6g");
        P(FLT_MIN,     "%18.6g");
#if FLT_HAS_SUBNORM
        P(FLT_TRUE_MIN,"%18.2g");
#endif
        puts("");
        P(DBL_DIG,     "%18d");
        P(DBL_MAX,     "%18.15lg");
        P(DBL_EPSILON, "%18.15lg");
        P(DBL_MIN,     "%18.15lg");
#if DBL_HAS_SUBNORM
        P(DBL_TRUE_MIN,"%18.2lg");
#endif
}
             FLT_DIG =                  6
             FLT_MAX =        3.40282e+38
         FLT_EPSILON =        1.19209e-07
             FLT_MIN =        1.17549e-38
        FLT_TRUE_MIN =            1.4e-45

             DBL_DIG =                 15
             DBL_MAX = 1.79769313486232e+308
         DBL_EPSILON = 2.22044604925031e-16
             DBL_MIN = 2.2250738585072e-308
        DBL_TRUE_MIN =           4.9e-324