【发布时间】:2011-01-10 05:07:28
【问题描述】:
我正在学习一些 C++ 中的 OpenGL 初学者教程,但是当我开始作为一名 C# 程序员时,它让我认为很多事情是理所当然的。所以当我调试将我的 FPS 读数打印到输出时出现了我的问题。我认为该方法类似于我头顶上的 DebugPrintString,它需要一个 char* 并且基本上我正在打印“FPS:x”。我使用 scanf_s 将 fps 值放入字符数组中,但这是我的问题所在。字符数组必须有多大?
让我再详细说明一下:我的 FPS 读数存储为浮点数,因为帧/秒通常最终不是一个好数字。所以我的号码可能是 60,也可能是 59.12345。 60 只需要 2 个字节,而 59.12345 需要 8 个(周期为 1)。所以我想“哦,好吧,我需要计算它的位数,没问题!”男孩让我感到震惊。
我做了一个计算数字的方法,计算小数点的左侧很容易,首先将它转换为 int 以删除小数点并除以 10(实际上我认为我有一些位移那里)并计算我可以这样做的次数,直到我达到0。现在计算右侧的数字,我将乘以10,减去数字,然后一直这样做直到它达到零。我认为该方法通常会返回 32。所以我 WTF'd 并在调试中查看了它,结果当你将浮点数相乘时有效地将数字列向上移动,因为众所周知的精度问题它只是附加了另一个数字!
我做了一些主要的谷歌搜索,但在 char str[128] 和 scanf 之上找不到任何内容,如果在 then 中执行 strlen(str) 减 1(空终止符)。但我希望有一个更优雅的解决方案。最后我只是将它转换为一个 int 并允许 9999 fps,还添加了一个检查以查看 fps > 9999 但我认为这不会发生。比 SEG FAULT 更安全:(
TLDR:有没有办法获得浮点数的位数? scanf 是怎么做到的?!
抱歉发了这么长的帖子,只是想分享一下我的挫败感>:D
编辑:拼写错误
【问题讨论】:
-
sprintf?这句话是填充文本。
-
抱歉什么意思?时间太长了?是的哈哈对不起:P
-
“递归”需要在他的评论中至少写 15 个字符。 “冲刺?”只有八岁。
-
这可能是使用这 7 个字符最令人困惑的方式。
标签: c++ floating-point floating-accuracy frame-rate