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) 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐

  • 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