awk中的浮点计算

2024-01-12

我对以下行为感到惊讶awk表演时浮点计算。这导致我对表数据的计算错误。

$ awk 'BEGIN {print 2.3/0.1}'
23  <-- Ok
$ awk 'BEGIN {print int(2.3/0.1)}'
22  <-- Wrong!

$ awk 'BEGIN {print 2.3-2.2==0.1}'
0   <-- Surprise!
$ awk 'BEGIN {print 2.3-2.2>0.1}'  <-- Din't produce any output :(
$ awk 'BEGIN {print 2.3-2.2<0.1}'
1   <-- Totally confused now ...

有人可以阐明这里发生的事情吗?

EDIT 1

正如所指出的@fedorqui,倒数第二个命令的输出转到名为的文件0.1由于重定向运算符(>).

那我该怎么表现比...更棒 (>) 手术?

其解决方案也给出了@fedorqui

$ awk 'BEGIN {print (2.3-2.2>0.1)}'
0  <-- Wrong!

以下部分来自manual http://www.gnu.org/software/gawk/manual/gawk.html#Floating-Point-Issues应该可以帮助你理解issue你正在观察:

15.1.1.2 浮点数不是抽象数

与抽象意义上的数字不同(比如你在高中学习的数字) 学校或大学算术),计算机中存储的数字是有限的 在某些方面。它们不能代表无限数量的数字, 它们也不能总是准确地代表事物。尤其, 浮点数不能总是准确地表示值。这是 一个例子:

 $ awk '{ printf("%010d\n", $1 * 100) }'
 515.79
 -| 0000051579
 515.80
 -| 0000051579
 515.81
 -| 0000051580
 515.82
 -| 0000051582
 Ctrl-d

这表明某些值可以精确表示,而另一些值可以准确表示 只是近似值。这不是 awk 中的“错误”,而只是一个 计算机如何表示数字的工件。


强烈推荐阅读:

What every computer scientist should know about floating-point arithmetic http://dl.acm.org/citation.cfm?id=103163

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

awk中的浮点计算 的相关文章

  • 使用正确的头打印文件名

    我想获取当前目录中的文件名 使得文件的第一行等于myWord 我想结合find type f命令与 exec选项与head 1 filename但无济于事 有没有一些聪明的 单行的解决方案来解决这个问题 您可以使用find with awk
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 使用浮点/双除法比较可约分数

    假设我有两个分数 a b 和 c d 其中 a b c d 都是大于 0 的整数 使用以下函数检查它们的相等性是否安全 bool are equal fractions int a int b int c int d return stat
  • 什么是浮点推测以及它与编译器的浮点模型有何不同

    英特尔 C 编译器提供两个控制浮点的选项 fp 推测 快速 安全 严格 关闭 fp model 精确 快速 严格和源 双 扩展 我想我明白 fp model 的作用 但什么是 fp 推测以及它与 fp 模型有何关系 我还没有找到任何解释这一
  • C语言中如何比较float变量和double变量?

    float num1 1 if num1 1 printf Yes it is equal n else printf No it is not equal n 输出 gt 是的 它是相等的 whereas float num1 1 2 i
  • 如何翻转双精度数的指数(例如 1e300->1e-300)?

    我有兴趣编写一个快速的 C 程序来翻转双精度数的指数 例如 该程序应将 1e300 转换为 1e 300 我想最好的方法是一些位运算 但我缺乏足够的知识来实现 这一点 有什么好主意吗 假设您要对小数指数求负 则科学记数法中十次方的指数 in
  • 对重复的名称添加双引号

    我想从文件中找到重复的名称 如下所示 并用 标记它们 file James Miki 123 456 7890 Wang Tai 234 563 6879 James Miki 123 456 7890 输出希望看起来像 James Mik
  • 折叠具有多个字段的行

    我有这个代码 awk seen 1 2 a 1 a 1 a 1 t 2 END for i in a print i a i inputfile 我想折叠具有两个以上字段的行 但始终基于第一个字段作为索引 输入文件 三列制表符分隔 prot
  • 如何将查找和替换限制为 CSV 中的一列?

    我有一个 4 列 CSV 文件 例如 0001 fish animal eats worms I use sed对文件进行查找和替换 但我需要将此查找和替换限制为仅在第 3 列中找到的文本 如何让查找和替换仅发生在这一列上 您确定要使用se
  • 使用 awk 解析日志文件

    我尝试使用以下代码解析日志文件 if line match then awk 2 vFiler echo vFiler 解释 有一些行以这样的模式开头 或 vol 后跟名称 我想找到所有以 或 vol 并将后面的字符串设置为等于变量 但我真
  • iOS5 Xcode4.2浮点字节对齐错误?

    看这段代码 这是具有 1 字节结构包装的结构定义文件 用于套接字网络 pragma pack 1 typedef struct TestStruct1 double d1 double d2 TestStruct1 typedef stru
  • awk 每个文件后换行

    使用此脚本 每个字段都会根据当前文件的最长单词打印出来 但需要每个文件都有一个换行符 如何才能实现这一目标 awk BEGIN ORS n FNR NR a i 0 if length 0 gt length max max 0 l len
  • AWK 错误:尝试在标量上下文中使用数组

    我正在学习AWK 这是一个简单的代码片段 我尝试将字符串拆分为数组并迭代它 BEGIN split a b c a for i 1 i lt length a i print a i 运行此代码时 我收到以下错误 awk awk txt 4
  • 是否有一个函数可以检索某个范围内可用的不同值的数量?

    我正在制作的应用程序中使用双精度浮点变量 我标准化了一些值范围 从 例如 我有很多范围 48 0 to 48 0 to 0 0 to 1 0 使用这个简单的函数 double ToNormalizedParam double nonNorm
  • 如何检测跨平台浮点行为的差异

    我可以执行哪些检查来确定两个硬件平台的浮点行为有何差异 验证 IEEE 754 合规性或检查已知错误可能就足够了 以解释我观察到的输出差异 我通过 proc cpu 查看了 CPU 标志 两者都声称支持 SSE2 我在看 https www
  • 我应该使用 AWK 或 SED 删除 CSV 文件中引号之间的逗号吗? (重击)

    我有一堆日常打印机登录CSV格式 我正在编写一个脚本来跟踪使用了多少纸张并将信息保存到数据库中 但我遇到了一个小问题 本质上 日志中的一些文档名称中包含逗号 全部用双引号引起来 并且由于它采用逗号分隔格式 所以我的代码搞乱了并将所有内容推到
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 在 R 中,如何让 PRNG 在平台之间给出相同的浮点数?

    在 R 4 1 1 中运行以下代码会在平台之间产生不同的结果 set seed 1 x lt rnorm 3 3 print x 22 0 83562861241004716 intel windows 0 8356286124100471

随机推荐