float 变量不满足条件 (C)

2023-12-26

我试图让用户输入 1.00000 到 0.00001 之间的数字,而边缘不包含在浮点变量中。我可以假设用户在点后输入的数字不超过 5 个。 现在,这是我写的:

printf("Enter required Leibniz gap.(Between 0.00001 to 1.00000)\n");
scanf("%f", &gap);
while ((gap < 0.00002) || (gap > 0.99999))
{
printf("Enter required Leibniz gap.(Between 0.00001 to 1.00000)\n");
scanf("%f", &gap);
}

现在,当我输入尽可能小的数字:0.00002 时,就会陷入 while 循环。 当我运行调试器时,我看到 0.00002 与该值一起存储在浮点变量中:1.99999995e-005 任何人都可以为我澄清我做错了什么?为什么 0.00002 不满足条件?这个“1.99999995e-005”是什么东西。


这里的问题是你正在使用float多变的 (gap),但您将其与double持续的 (0.00002)。常数是double因为除非另有说明,C 中的浮点常量都是 double 的。

一个根本问题是数量0.00002都不能代表float or double。 (它根本无法用二进制浮点数表示,因为它的二进制扩展是无限长的,就像 &frac13; 的十进制扩展一样。)所以当你写0.00002在程序中,C 编译器将其替换为double值非常接近0.00002。同样,当scanf读取号码0.00002 into a float变量,它替代了float值非常接近0.00002. Since double数字的位数多于floats, the double值更接近于0.00002float value.

当您比较两个具有不同精度的浮点值时,编译器会将精度较低的值转换为精度较高的完全相同的值。 (该组值表示为double是表示为的值集的超集float,所以总是可以找到一个double其值与 a 的值相同float.) 这就是当发生的情况gap < 0.00002被执行:gap被转换为double相同的值,并且与 double 相比(接近)0.00002。由于这两个值实际上都略小于 0.00002,并且double越接近,则float小于double.

您可以通过多种方式解决此问题。首先,您可以通过以下方式避免转换:gap a double并改变scanf格式化为%lf,或者通过比较gap to a float:

while (gap < 0.00002F || gap > 0.99999F) {

但这并不完全正确,原因有几个。首先,实际上不能保证 C 编译器完成的浮点转换与标准库完成的转换相同(scanf),并且该标准允许编译器使用“以实现定义的方式选择的最接近的可表示值,或者紧邻最近可表示值的较大或较小的可表示值”。 (它没有详细说明哪个值scanf产生其中之一,但建议它是最接近的可表示值。)碰巧的是,gcc and glibc(Linux 上使用的 C 编译器和标准库)都生成最接近的可表示值,但其他实现则不会。

无论如何,根据您的错误消息,您希望该值介于0.00001 and 1.00000。所以你的测试应该是这样的:

while (gap <= 0.00001F || gap >= 1.0000F) { ...

(假设你保留gap as a float.)

上述任何解决方案都可以。就我个人而言,我会做gap a double为了让比较更直观,也将比较改为compare against0.00001 and 1.0000.

顺便说一句,E-05后缀的意思是“十的-5次方”(E代表Exponent)。你会经常看到这样的情况;这是编写浮点常量的标准方法。

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

float 变量不满足条件 (C) 的相关文章

  • 警告:从指针目标类型中丢弃“const”限定符

    没有const char s意味着 s 是一个指向常量 char 的指针 那么为什么它给我这个警告 我并不是想改变价值观 在第一个函数中警告是return discards const qualifiers from pointer tar
  • ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共构造函数吗?

    在我的两门课程中 看起来像这样 最少 using System using System Collections Generic using System Collections using System ComponentModel us
  • 何时对向量进行归一化?

    我正在学习 XNA 并且在几乎所有的教育套件中都可以找到http creators xna com en US http creators xna com en US 我总是看到向量上对 Normalize 的调用 我知道归一化基本上将向量
  • 此插件导致 Outlook 启动缓慢

    我正在使用 C NET 4 5 开发 Outlook Addin 项目 但部署后 有时 Outlook 会禁用我的插件 并显示此消息 这个插件导致 Outlook 启动缓慢 我不知道我的插件出了什么问题 这只有很少的代码 并且ThisAdd
  • 浏览器收集哪些值作为回发数据?

    当页面被发送回服务器时 浏览器收集每个控件的当前值并将其粘贴到一个字符串中 然后 该回发数据通过 HTTP POST 发送回服务器 Q1 除了控件的 Text 属性和 SelectedIndexchanged 因此除了用户输入数据 之外 控
  • 隐形打开的弹出窗口

    第二天就解决这个问题 要重现 请创建新的 WPF 应用程序 xaml
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 如何在 C++ 的子目录中创建文件?

    这是我的代码 如何在子目录联系人中创建文件 每次创建该文件时 它都会出现在与我的程序相同的目录中 int main ofstream myfile contacts myfile open a myfile close 在构造函数中指定完整
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • C++ 析构函数:何时释放内存?

    如果我删除一个导致其析构函数被调用的对象 那么内存是在析构函数完成函数中的任何操作之前还是之后被释放 仅当最小派生类子对象被销毁后才会释放内存 所以如果你有 class Base class Derived public Base publ
  • IBM Watson 对话服务错误:无法从“方法组”转换为“conversation.onMessage”

    我正在尝试运行 IBM Watson会话服务团结和下面是代码片段 https github com watson developer cloud unity sdk conversation private Conversation m C
  • 如何使用 C# 代码使用超链接的 onClick 事件?

    我正在尝试为页面中的超链接添加条件 而不是仅仅使用特定的链接 例如 a href help Tutorial html Tutorial a 我想为不同的用户显示不同的页面 例如 如果用户以管理员身份登录 他们将看到与普通用户不同的链接 我
  • 在 C# 中生成随机值

    如何使用以下命令生成随机 Int64 和 UInt64 值RandomC 中的类 这应该可以解决问题 这是一个扩展方法 因此您可以像调用普通方法一样调用它Next or NextDouble上的方法Random目的 public stati
  • 使用 cudamalloc()。为什么是双指针?

    我目前正在浏览有关的教程示例http code google com p stanford cs193g sp2010 http code google com p stanford cs193g sp2010 学习CUDA 演示的代码 g
  • fscanf 和 EOF 中的否定扫描集

    我的文件中有一个以逗号分隔的字符串列表 姓名 1 姓名 2 姓名 3 我想跳过所有逗号来阅读这些名字 我写了以下循环 while true if fscanf file my string 1 break 然而 它总是比预期多执行一次 给定
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • printf 参数不足

    我的问题是关于缺少参数的 printf 之后的行为 printf s blah blah d int integer was given as argument and not int written 我已经知道 如果格式参数不足 则行为是
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • Intel 和 AMD 处理器有相同的汇编程序吗?

    C语言被用来编写Unix以实现可移植性 使用不同编译器编译的同一个C语言程序会产生不同的机器指令 为什么 Windows 操作系统能够在两者上运行Intel https en wikipedia org wiki Intel and AMD
  • Crypto++ 和压缩 EC 密钥

    如何在 Crypto 中生成压缩的 ECDSA 密钥 AutoSeededRandomPool prng ECDSA

随机推荐

  • Ruby:使用字符串插值进行评估

    我不明白 为什么eval工作原理如下 123 456 to s 789 gt 123 456 789 eval 123 456 to s 789 gt 123 我怎样才能插入到一个字符串里面eval Update 谢谢你们 朋友们 有效 所
  • Go语言是否对字符串使用写时复制[重复]

    这个问题在这里已经有答案了 Go语言是否像Java一样对字符串使用写时复制 IE 如果我按值将字符串传递给方法并且从不更改它 则会分配内存并复制字符串 这将是时间效率低下的 或者它只会引用单个副本 它不是写入时复制 因为字符串是不可变的 但
  • Github Gists 语法高亮不起作用

    我正在尝试使用 Markdown 语法突出显示创建一个要点 不幸的是无法在这里发布屏幕截图 然后我按 保存 但没有应用语法突出显示 Python 代码也存在同样的问题 您需要将文件扩展名更改为 md 这是我的叉子gist https gis
  • 使用 Visual Studio 2010 Web Config 转换删除 XML 注释

    我们正在使用 Team Build 来处理对开发服务器的部署 并且需要在转换时从 Web 配置中删除注释 有谁知道如何删除使用转换从 Web 配置文件中注释行 我找到了答案 这似乎是 Visual Studio Team Build 中 X
  • 使用两个校准相机进行 3D 重建 - 该管道中的错误在哪里?

    有很多关于从已知内部校准的立体视图进行 3D 重建的帖子 其中一些是出色的 https stackoverflow com questions 16639106 camera motion from corresponding images
  • 构造正则表达式模式来匹配句子

    我正在尝试编写一种正则表达式模式 该模式将匹配以多个或一个制表符和 或空格开头的任何句子 例如 我希望我的正则表达式模式能够匹配 你好 我喜欢正则表达式 但我正在摸索如何匹配 hello 之后的单词 到目前为止我有这个 String REG
  • 使用 Bokeh 查看 dicom 图像

    我正在尝试将图形背景设置为 dicom 图像 我跟着这个例子 http bokeh pydata org en 0 11 1 docs gallery image rgba html 但是图像数据由dicom pixel array不是RG
  • 我的java代码有一个明显的错误。为什么能编译并运行?

    public class HelloWorld public static void main String args System out println Hello http www google com System out prin
  • 使用 QueryMap 进行改造

    我有一些相同的要求endpoint但参数和返回类型不同 I used QueryMap对于参数但我不知道如何编写返回类型 我必须写 GET xxx Call
  • 如何在jquery中将日期和时间转换为timeago格式

    我正在尝试显示 Facebook 新闻源并在移动网络应用程序上显示它们 它工作正常 但问题是它在移动网络浏览器上不以 timeago 格式 即 2 天前 显示时间 但另一方面它在桌面上正确显示 日期和时间的格式为 2011 09 13T11
  • React Swiper Js 自动播放不会使雨刮器自动滑动

    我在 React 中使用这个滑动器 https swiperjs com react https swiperjs com react 我试图使其 自动播放 但它不会自动滑动 这是我尝试过的 https swiperjs com get s
  • Ruby Http Post 参数

    如何将帖子参数添加到我现在拥有的内容中 toSend nonce gt Time now to i command gt returnCompleteBalances to json uri URI parse https poloniex
  • 通知是什么:资源 id#9? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • Coq:将信息保存在匹配语句中

    我正在构建一个递归函数match在清单上l 在里面cons分支我需要使用以下信息l cons a l 为了证明递归函数终止 但是 当我使用match l信息丢失 我该如何使用match保留信息 这是函数 drop and drop lemm
  • 从存储库 Databricks 中的另一个笔记本运行笔记本

    我有一个笔记本 其功能位于存储库文件夹中 我试图在另一个笔记本中运行它 通常我可以这样运行它 run Users name project file name 因此 我将这两个文件 function notebook processed n
  • 是否可以执行 If Else 或 Switch 语句 Firestore 规则

    是否可以在 firestore 规则中执行 Switch 语句或 if else 我试图寻找它 但没有找到答案 我尝试的是 function getTier return get users request auth uid data us
  • Synology 网站简单的“hello world”快速入门使用 python、flask 和 uwsgi

    我注意到 Synology 的本机网站使用 uwsgi 框架 最近添加了对 python 脚本的支持 我想知道是否有人可以帮我找出一个简单的 hello world 示例 我不清楚 uwsgi 文件中应放入什么内容 我按照 uwsgi 文档
  • 这种锁定技术的名称是什么?

    我有一个巨大的 Trove 地图和一个需要从多个线程经常调用的方法 大多数时候这个方法会返回true 线程正在进行大量的数字运算 我注意到由于以下方法而存在一些争用 这只是一个示例 我的实际代码有点不同 synchronized boole
  • Jenkins 构建流程与工作流程(管道)插件

    我注意到 Jenkins 至少 有两个编排选项 构建流程 https wiki jenkins ci org display JENKINS Build Flow Plugin Workflow https github com jenki
  • float 变量不满足条件 (C)

    我试图让用户输入 1 00000 到 0 00001 之间的数字 而边缘不包含在浮点变量中 我可以假设用户在点后输入的数字不超过 5 个 现在 这是我写的 printf Enter required Leibniz gap Between