免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3632 | 回复: 9
打印 上一主题 下一主题

求教awk里运算问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-30 12:13 |只看该作者 |倒序浏览
  1. #!/bin/bash

  2. P=0.14
  3. L=0.05
  4. G_MIN=0.04

  5. echo "16 1 23" | gawk '{
  6. f[1]=$1      
  7. f[2]=$2     
  8. AAA=$3*'$P'
  9. }
  10.   
  11. END{ BBB=(f[1]+f[2])*'$P'+f[1]*'$L'+f[2]*'$G_MIN';
  12.      differen=AAA-BBB
  13.      print BBB" "AAA" "differen;
  14.   }'
复制代码
结果是3.22 3.22 -4.44089e-16

我想要的结果是前面两个值的差,应该是0cai

论坛徽章:
0
2 [报告]
发表于 2011-08-30 12:16 |只看该作者
回复 1# 树上开花


    是0才对呀,怎么是一个红色的哪个数值呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:55:28
3 [报告]
发表于 2011-08-30 12:34 |只看该作者
诡异。。。传说中的精度丢失吗?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2011-08-30 13:10 |只看该作者
本帖最后由 yinyuemi 于 2011-08-30 13:32 编辑

回复 1# 树上开花


    BEGIN 里面设置OFMT吧,比如OFMT="%.2f"
    默认的OFMT是"%.6g";

  1. awk 'BEGIN{print 0.0000001+0.01; # 结果小于0,保持原来的精度
  2. print 1.0000001+1.001 #结果大于1,精度与浮点数小的保持一致
  3. print 1.0000001-1.000000001
  4. print 1.00000001+1.0000000001 # 结果大于1,每个精度大于6,精度丢失???(楼下解释)
  5. }'
  6. 0.0100001
  7. 2.001
  8. 9.9e-08
  9. 2

复制代码

论坛徽章:
0
5 [报告]
发表于 2011-08-30 13:58 |只看该作者
设了OFMT="%.2f",因为我的数值都是两位小数,还是不对.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2011-08-30 14:08 |只看该作者
这不是很正常的吗?

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
7 [报告]
发表于 2011-08-30 14:08 |只看该作者
换printf试试看。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
8 [报告]
发表于 2011-08-30 14:16 |只看该作者
我猜测print打印的时候产生的问题,我之前遇到过类似的,printf可以控制打印格式。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
9 [报告]
发表于 2011-08-30 14:23 |只看该作者
浮点计算就是这样的。
  1. printf "%.2f %.2f %.2f\n" ,  AAA, BBB, differen
复制代码

论坛徽章:
0
10 [报告]
发表于 2011-08-30 14:33 |只看该作者
  1. #!/bin/bash
  2. #
  3. P=0.14
  4. L=0.05
  5. G_MIN=0.04
  6. #
  7. echo "16 1 23" | gawk '{   
  8. f[1]=$1      
  9. f[2]=$2   
  10. AAA=$3*'$P'
  11. }
  12. END{
  13. BBB=(f[1]+f[2])*'$P'+f[1]*'$L'+f[2]*'$G_MIN';
  14. differen=AAA-BBB;   
  15. printf("%.2f %.2f %.2f\n",BBB,AAA,differen);
  16. }'

复制代码
3.22 3.22 -0.00

可以了,谢谢各位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP