【问题标题】:How to assign a float value using GMP library in C?如何使用 C 中的 GMP 库分配浮点值?
【发布时间】:2016-10-16 11:47:11
【问题描述】:

我正在尝试通过编写一个简单的程序将一些浮点数相加来学习如何在 C 中使用 GMP 库,但在运行时它会报错:

GNU MP: Cannot allocate memory (size=140735132293330)
Aborted (core dumped)

代码如下:

#include <gmp.h>
#include <stdio.h>

int main(){
  mpf_set_default_prec(64);

  mpf_t sum;
  mpf_init(sum);
  mpf_set_ui(sum,0);
  unsigned int i = 0;

  while (i < 4) {
    mpf_add_ui(sum,sum,i);
    i++;
  }

  mpf_out_str(stdout,10,sum);
  printf ("\n");
  mpf_clear(sum);
}

我可以只使用 GMP mpz 函数来执行此操作而不会出现问题,但是当我尝试使用浮点数时,我被卡住了。该文档并没有真正显示任何浮点函数的真实示例,所以也许我正在初始化或分配不正确的值。

【问题讨论】:

  • 始终在严格的标准一致性模式下使用您的编译器并启用所有可用的警告。在解决所有警告之前,请勿在 Stack Overflow 上发帖。现有工具可以完全自动诊断 99% 的编程问题。

标签: c linux memory numbers gmp


【解决方案1】:

来自the documentation

在 gmp.h 之前包含 stdio.h 是个好主意,因为这将允许 gmp.h 为这些函数定义原型

这样你会得到一个错误,因为你使用错误数量的参数调用函数。由于缺少声明而没有收到任何警告的原因是 mpf_out_str 是一个宏,在 gmp.h 中定义,它在您的机器上安装在 /usr/include 中,因此被视为系统头文件,因此警告被禁用(使用-Wsystem-headers 看到它)。这感觉就像 gcc 中的错误功能......

【讨论】:

  • 谢谢,不知怎的,我错过了。
【解决方案2】:

您一定没有正确检查编译器警告,但简单的错误是您使用错误数量的参数调用mpf_out_str,您可以在the documentation 中查找:

size_t mpf_out_str (FILE *stream, int base, size_t n_digits, const mpf_t op)
//                                          ^^^^^^^^^^^^^^^^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多