【问题标题】:How to approximate a number to a n number of decimal places?如何将一个数字逼近到小数点后 n 位?
【发布时间】:2015-03-28 20:08:37
【问题描述】:

我几周前才开始使用maxima(实际上我刚刚使用过几次)和OS X的wxMaxima界面。

我试图在网上找到一个解决方案,但可能是因为我是盲人,也可能是因为我没有太多在 maxima 的官方文档中搜索的经验,我还没有找到具体的解决方案。

如何将数字近似为n 的小数位数?例如,如果我使用float(22/7),它会给我这个巨大的数字3.142857142857143,但我只想将它近似到小数点后第三位3.143

【问题讨论】:

    标签: math maxima


    【解决方案1】:

    fpprec 控制 Maxima bigfloat 中有效数字的实际数量。这仅适用于大浮点数,不适用于普通(固定精度,IEEE 754)浮点数。

    另请参阅fpprintprec,它控制打印的位数,适用于大浮点数和普通浮点数。所以你的另一个解决方案是:

    (%i1) fpprintprec : 4 $
    (%i2) float (22/7);
    (%o2)                                3.143
    

    【讨论】:

    • 嗯,它不仅控制打印的位数,还可以近似一个变量。 fpprintprec : 4, x:float(%pi);。然后x 将包含3.145。我说的对吗?
    • @Rinzler 不,fpprintprec 对变量的值没有任何影响(float 和 bigfloat 都没有)。当您将float(%pi) 分配给x 时,无论fpprintprec 是什么,它都是相同的值。尝试更改fpprintprec 并再次输出x。您会看到不同的位数。
    • 有没有办法改变变量?例如,我需要将函数的一些结果(我需要近似为 3 个十进制数字)与欧拉数 2.718 的近似值进行比较,而不是与给定最大值的数字进行比较......跨度>
    • @Rinzler 我不确定我理解你想要什么。听起来像使用 fpprecbfloat 是您想要的,因为您想要具有不同精度的结果,而普通浮点数具有固定精度。但也许你可以多说一些你想要达到的目标。
    【解决方案2】:

    我还没有找到一种使用float 来近似数字的方法,但我找到了一种使用bfloat 来近似的方法。

    来自official documentation

    bfloat (expr)

    expr中的所有数字和数字函数转换为bigfloat 数字。结果 bigfloats 中的有效位数 由全局变量fpprec指定。

    因此,我可以通过使用这样的东西或多或少地实现我想要的:

    bfloat(%e), fpprec:4;
    

    输出是:

    2.718b0
    

    如果有人知道如何使用float 功能,请发布。

    【讨论】:

      【解决方案3】:

      一种选择是定义

      decimal_places(ex,n):=parse_string(printf(false,sconcat("~,",n,"f"),ex));
      

      例如

      decimal_places(22/7,4);
      

      但是,请注意将十进制数表示为二进制浮点数而导致的数值舍入(内部)。

      例如

      printf(false,"~,1f",1.45);
      

      返回 1.4

      printf(false,"~,3f",0.0145);
      

      返回 0.015。

      不是银行家的四舍五入(顺便说一句,“round”是这样做的...... 比较 round(1.5);round(2.5);)。

      【讨论】:

      • 这比我乍一看更棘手......无论如何,不​​涉及字符串操作的小数位函数的定义是这样的:dp(e, n) := block([m], m: ceiling (log(float(e))/log(10.0)), float(e)*10^(n - m), round(%%), %%*10.0^(m - n))。例如。 dp(%e, 3) => 2.72,dp(1000*%e, 3) => 2720.0,dp(%e/1000, 3) => 0.00272。
      • 几个关于decimal_places的cmets如上图所示。 (1) 可以通过在~f 格式化程序中使用v 来指示 printf 输出中的可变精度,例如printf(true, "~,vf~%", 4, 1.234567) 输出 1.2346。 (2) 对~f 格式执行的舍入对于以5 结尾的输入没有明确定义。 Maxima printf 平底船到 Common Lisp FORMAT,并且 CL 规范说以 5 结尾的输入的舍入可以向上舍入或向下舍入——它留给 Lisp 实现。我认为这是规范中的一个不幸缺陷。
      【解决方案4】:
      rnddp(x,dp):=float((round(x*10^dp)/10^dp));
      
      rndcdp(z,dp):=rnddp(realpart(z),dp)+%i*rnddp(imagpart(z),dp);
      

      rnddp 会将其第一个参数四舍五入为第二个参数中提供的小数位数。

      rndcdp 对复数也是如此。

      结果是近似值,而不仅仅是显示值。

      【讨论】:

        猜你喜欢
        • 2015-08-02
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        相关资源
        最近更新 更多