极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17557|回复: 5

[关于极限]为什么求π的程序会出现空数据?

[复制链接]
发表于 2016-3-5 01:26:53 | 显示全部楼层 |阅读模式
本帖最后由 Jackxwb 于 2016-3-5 01:44 编辑

变量上已经用了long类型了,从数值上看也没有超出范围。
原程序地址:http://www.cnblogs.com/PegasusWang/archive/2013/03/17/2965189.html
关于printf命令用了中文社区 奈何col 的程序
地址:http://www.arduino.cn/thread-8366-1-1.html

移植版(本人copy后略微修改过)
  1. int a = 10000, b, c = 1000,  e, g, ls, ls2, cs;
  2. long d,  f[1001];
  3. int serial_putc( char c, struct __file * )
  4. {
  5.   Serial.write( c );
  6.   return c;
  7. }
  8. void printf_begin(void)
  9. {
  10.   fdevopen( &serial_putc, 0 );
  11. }
  12. void setup() {
  13.   // put your setup code here, to run once:
  14.   int i;
  15.   Serial.begin(9600);
  16.   printf_begin();
  17.   Serial.println("pi =");
  18.   for (i = 0; i < c; i++)
  19.     f[i] = a / 5;
  20.   while (c != 0)
  21.   {
  22.     d = 0;
  23.     g = c * 2;
  24.     b = c;
  25.     while (1)
  26.     {
  27.       d = d + f[b] * a;
  28.       g = g - 1;
  29.       f[b] = d % g;
  30.       d = d / g;
  31.       g = g - 1;
  32.       b = b - 1;

  33.       if (b == 0) break;
  34.       d = d * b;
  35.     }
  36.     c = c - 14;
  37.     cs++;
  38.     printf("(%.4d)%d", e + d / a, cs);//此次加括号仅为了好看。cs本为循环次数
  39.     if (e + d / a == 0) break;
  40.     e = d % a;
  41.   }
  42.   Serial.println("");
  43.   Serial.println("run:" + ls);
  44. }

  45. void loop() {
  46.   // put your main code here, to run repeatedly:

  47. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-3-5 01:36:56 | 显示全部楼层
本人使用的是mega 2560,内存已使用了51%


如果编译时提示“没有足够的内存。”时,请把 f 的数组及 c 的数组改小一点。(c 的值等于 f 的数组数减一)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2016-3-6 00:25:53 | 显示全部楼层
有檢查過 b 的值有可能 < 0 嗎?

在 設定
  1. f[b] = d % g;
复制代码
之前, 加入以下的檢測看看:
  1. if (b < 0 )Serial.println("Error: b < 0");
复制代码
回复 支持 反对

使用道具 举报

发表于 2016-3-7 16:29:07 | 显示全部楼层
楼上正解,是由于c-14 造成的b小于0,c的数值应该是14的整数倍,就不会有此问题了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-28 21:21:17 | 显示全部楼层
本帖最后由 Jackxwb 于 2016-3-28 22:25 编辑
janeasy 发表于 2016-3-7 16:29
楼上正解,是由于c-14 造成的b小于0,c的数值应该是14的整数倍,就不会有此问题了。


谢谢!
.
一开始是想用来测试一下性能的,由于考虑到变量有效范围太窄,目前已经放弃了。
这么久没回复不好意思~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-28 22:25:35 | 显示全部楼层
Super169 发表于 2016-3-6 00:25
有檢查過 b 的值有可能 < 0 嗎?

在 設定之前, 加入以下的檢測看看:

谢谢!
虽然目前已经放弃这个项目了,但还是要感谢一下。
这么久没回复不好意思~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 06:00 , Processed in 0.086951 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表