非常非常长的数的模 (fmod)

2023-12-06

我想使用 Cpp 查找阶乘中零的数量。问题是当我使用非常大的数字时。

#include <stdio.h>
#include <math.h>

long zeroesInFact(long n)
{
long double fact=1;
long double denominator=10.00;
long double zero=0.0000;
long z=0;
printf("Strating loop with n %ld\n",n);
for(int i=2;i<=n;i++)
{
    fact=fact*i;
    printf("Looping with fact %LF\n",fact);
}
printf("Fmod %lf %d\n",fmod(fact,denominator),(fmod(fact,denominator)==zero));
while(fmod(fact,denominator)==zero)
{
    fact=fact/10;
    z++;
}
printf("Number of zeroes is %ld\n",z);
return z;
}

int main()
{
long n;
long x;
scanf("%ld",&n);
for(int i=0;i<n;i++)
{
    scanf("%ld",&x);
    printf("Calling func\n");
    zeroesInFact(x);
}
return 0;
}

我认为这里的问题是

fmod(事实,分母) 给出了 22 的阶乘和分母为 10.00(即 0.000)的正确答案。 但它给出了 23 的阶乘和分母为 10.00 的错误答案


将此视为您关于数字精度的第一课。类型float, double, and long double存储近似值,而不是精确值,这意味着它们通常不适合此类计算。即使它们具有足够的精度来获得正确答案,通常最好还是使用整数数字类型,例如int64_t and uint64_t。有时甚至可以使用 128 位整数类型。 (例如。__int128可能可与 Microsoft Visual Studio 一起使用)

老实说,我认为你很幸运能够得到正确的答案18!通过22!.

If long double在您的平台上确实是四倍精度,您应该能够计算最多30!, 我认为。你使用的时候犯了一个错误fmod-- 你打算使用fmodl.


关于精度的第二个教训是,当您需要大量精度时,您的基本数据类型根本不够好。虽然您可以编写自己的数据类型,但使用预先存在的解决方案可能会更好。这Gnu 多精度算术库 (GMP) 是一个可以在 C/C++ 中使用的又好又快的库。

或者,您可以切换语言 - 例如pythons 整数数据类型是任意精度(但不如 GMP 快),因此您甚至不必执行任何特殊操作。 Java 有BigInteger进行此类计算的类。


你的第三个教训是精确性,就是找到没有精确性的方法。你实际上不需要计算23!在其全部荣耀中找到尾随零的数量。您可以小心地组织计算以放弃不需要的额外精度。或者,您可以改用一种完全不同的方法来获取此数字,例如 Rob 在他的评论中暗示的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非常非常长的数的模 (fmod) 的相关文章

随机推荐

  • 将 PHP 网站与 Wordpress 用户身份验证集成

    我有一个现有的 Wordpress 网站 如果用户想要访问其他内容 完整故事 过去故事的存档等 则需要登录 我使用 PHP 和 MySQL 构建了一个新网站 该网站将托管在不同的服务器上 该网站的目标受众是访问前面提到的文章网站的同一受众
  • SKEmitterNode 粒子动作不工作 iOS9 Beta

    我正在 iOS9 Beta 4 中测试我的应用程序 发现许多曾经在 iOS8 中运行的代码不再按预期运行 另一个例子是 SpriteKit 的 SKEmitterNode articleAction 属性 以下代码在 iOS8 上有效 但在
  • Azure WebJobs NuGet 包错误

    我想知道是否有人在 Visual Studio 模板上的 Azure WebJobs 队列示例上遇到过运行错误 在我更新 NuGet 管理器上的所有包后 运行的示例会发出问题 这是错误消息 System InvalidOperationEx
  • 另一个字符串的子字符串会阻止父字符串被垃圾收集吗?

    String samplel ToBeGarbageCollected String sample2 samplel substring 0 1 samplel null 我知道子字符串内部会保留原始字符串的引用 但通过明确定义sample
  • 如何将更改从骨架子存储库拉入生产超级存储库

    我正在使用奥里莉亚骨架其中包含用于不同目的的各种项目设置 但这更多的是一个一般性问题 即如何使用 git 做一些事情 如下所述 我希望能够将 GitHub 框架存储库中发布的更新合并到我实际正在处理的项目中 你会怎么做 目前 我刚刚在 sc
  • 使用过滤器编辑 site_url

    使用 WordPress 调用site url 返回完整的站点 URL http www example com 我想做的是添加一些东西 add something here 在带有过滤器的 URL 末尾 我期待的结果是 http www
  • 仅将函数应用于具有可变位置的一列

    我有一堆不同的文件 所有文件都包含标题为 ID 的列 但不一定位于所有文件中的同一位置 我有一个函数想要应用于所有文件中的 ID 以将它们更改为 NEWID 我知道如果我传入 ID 的列号 我可以非常简单地做到这一点 假设它是 5 列文件中
  • 整数与长混淆

    我看到很多人相信以下观点 VBA 将所有整数值转换为 Long 类型 事实上 即使是MSDN 文章 says 然而 在最近的版本中 VBA 会将所有整数值转换为 Long 类型 即使它们被声明为 Integer 类型 这怎么可能 考虑这个简
  • 我如何知道方法调用可能引发哪些异常?

    有没有办法知道 在编码时 执行 python 代码时会出现哪些异常 我最终在 90 的情况下捕获了 Exception 基类 因为我不知道可能会抛出哪种异常类型 阅读文档并不总是有帮助 因为很多时候异常可以从深处传播 而且很多时候文档未更新
  • OpenCV v1/v2错误:该功能未实现

    我正在尝试让 OpenCV 在我的 Ubuntu 机器上使用 Python 我已经下载并安装了 OpenCV 但是当我尝试运行以下 python 代码时 应该从网络摄像头捕获图像并将其推送到屏幕 import cv cv NamedWind
  • 您可以将脚本分配给页面元素(形状等)吗?

    我想为学生制作一个交互式幻灯片 我想添加形状 因此当您单击形状时 它将运行 Apps Script 脚本 这在 Google 表格中是可能的 所以 我认为你也可以用幻灯片来做到这一点 没有办法运行容器绑定脚本通过点击 Google 幻灯片中
  • 使用新的亚马逊服务搜索亚马逊示例

    我找不到新的亚马逊服务的工作示例 或者至少在过去几年内 无论我在标题中输入什么内容 最接近的工作示例都会返回一个空项目 代码是 Amazon ProductAdvertisingAPI client AWSECommerceServiceP
  • 如何在 Three.js 中获取顶点的绝对位置?

    据我所知var point object geometry vertices i 将返回相对位置x y and z对象几何内部的点 如果对象被移动 旋转或缩放 如何获得绝对位置 您可以像这样获取顶点的世界位置 const vertex ne
  • 如何从互不关注的号码池中生成随机数

    我有一个数字池 例如 3 6 7 11 20 我需要每个数字在我的集合中出现 x 次 我的解决方案是创建一个包含两个整数 num numOfAppearnces 的类 我们称之为 元素 我在 arrayList 中创建了一个 元素 池 然后
  • 对 LAPACK 和 BLAS 子例程的未定义引用

    我试图了解 Fortran 中的 BLAS 和 LAPACK 如何工作等等 所以我编写了一个生成矩阵并将其反转的代码 这是代码 program test Implicit none external ZGETRF external ZGET
  • HRESULT 异常:0x80040111 (CLASS_E_CLASSNOTAVAILABLE)

    使用 Net 4 0 WPF 应用程序 C 我的应用程序中有以下代码 当Select单击按钮 OpenFileDialog fdgSelectFile bool dialogResult try fdgSelectFile new Open
  • Scala 通过 Spark 与纱线 - 缺少大括号字符串

    我编写了一些 scala 代码 看起来像这样 object myScalaApp def main args Array String Unit val strJson args apply 0 println strJson strJso
  • 如何使用 Java 的服务帐户访问 Google 表格?

    我正在尝试从服务帐户访问 Google 表格 服务帐户有权访问该表格 但我有一个问题 所有文档 包括官方文档点使用GoogleCredential自 1 7 起已弃用 弃用表示您应该使用库google auth library这就是我正在做
  • 查看扩展的 C 宏

    如果我想扩展 C 宏 有哪些好的方法可以做到这一点 除了手动跟踪之外 例如 GTK WIDGET SET FLAGS 它使用一个宏 该宏使用一个宏 该宏使用一个 或两个 宏 我只想看到它以某种方式自动扩展 而不是搜索每个宏 每一步 UPDA
  • 非常非常长的数的模 (fmod)

    我想使用 Cpp 查找阶乘中零的数量 问题是当我使用非常大的数字时 include