为什么浮点数乘以时没有错误?(Why there is no errors while multiplying floating point numbers?)
我需要对浮点数学进行一些澄清。
我为学习者写了一些代码:
#include "stdio.h" int main (int argc, char const *argv[]) { int i; double a=1.0/10.0; double sum=0; for(i = 0; i < 10; ++i) sum+=a; printf("%.17G\n", 10*a ); printf("%d\n", (10*a == 1.0) ); printf("%.17G\n", sum ); printf("%d\n", (sum == 1.0) ); return 0; }
它给出的输出是:
1 1 0.99999999999999989 0
为什么(sum == 1.0) - 是假的是相当可理解的,但为什么乘法给出正确答案而没有错误?
谢谢。
I need some clearification about floating point math.
I have wrote some code for the learning purpouses:
#include "stdio.h" int main (int argc, char const *argv[]) { int i; double a=1.0/10.0; double sum=0; for(i = 0; i < 10; ++i) sum+=a; printf("%.17G\n", 10*a ); printf("%d\n", (10*a == 1.0) ); printf("%.17G\n", sum ); printf("%d\n", (sum == 1.0) ); return 0; }
and the output it gives is:
1 1 0.99999999999999989 0
Why (sum == 1.0) - is false is pretty understandabale, but why multiplying gives the right answer without the error?
Thanks.
原文:https://stackoverflow.com/questions/21654098
更新时间:2023-01-08 12:01
最满意答案
如果适合,你可以试试这个吗?
SELECT array_agg(t2.name), array_agg(t1.playerid), date (t1.starttime), Count(t1.starttime) as "# Plays", Count(distinct(t1.playerid)) as "# Stores" FROM public.billing t1 JOIN public.medias t2 on t1.mediaitemid = t2.id JOIN public.players t3 on t1.playerid = t3.id WHERE t3.store in ('0038','3285') and t2.name LIKE any (array['COMM_7032%']) and t1.starttime >= date('2017-04-26') and t1.starttime < date('2017-05-01') and t1.channelname = 'myNetwork' GROUP BY date (t1.starttime) ORDER BY date (t1.starttime)
Could you please try this one if it fits:
SELECT array_agg(t2.name), array_agg(t1.playerid), date (t1.starttime), Count(t1.starttime) as "# Plays", Count(distinct(t1.playerid)) as "# Stores" FROM public.billing t1 JOIN public.medias t2 on t1.mediaitemid = t2.id JOIN public.players t3 on t1.playerid = t3.id WHERE t3.store in ('0038','3285') and t2.name LIKE any (array['COMM_7032%']) and t1.starttime >= date('2017-04-26') and t1.starttime < date('2017-05-01') and t1.channelname = 'myNetwork' GROUP BY date (t1.starttime) ORDER BY date (t1.starttime)
相关问答
更多-
Postgres动态查询功能(Postgres Dynamic Query Function)[2023-10-04]
你不能使用变量来代替这样的标识符。 你需要用动态查询来完成。 它看起来像这样: EXECUTE 'SELECT * FROM ' || quote_ident(tname) || ' WHERE ' || quote_ident(cname) || ' NOT IN (''AK'',''CK'');' INTO result_var; 如果您使用PostgreSQL 9.1或更高版本,则可以使用format()函数 ,这使得构建该字符串变得更加容易。 You cannot use a v ... -
问题不在UserService中,它在我的PGService类中。 这是: public class PGService { private final Sql2o connectionPool; public PGService() throws ConfigurationException, IOException { Config cfg = loadConfig("dbconfig.json"); if (cfg == null) { ...
-
复制命令是执行此操作的最佳方法: http://www.postgresql.org/docs/9.3/static/sql-copy.html COPY table_name [(column_name [,...])] FROM {'filename'| PROGRAM'命令'| STDIN} [[WITH](选项[,...])] COPY {table_name [(column_name [,...])] | (查询)} TO {'文件名'| PROGRAM'命令'| STDOUT} [[WITH] ...
-
您有一个典型的多对多关系的表结构。 你可以得到子服务列表: SELECT ssvc.subservice_name FROM service svc, service_subservice ss, subservice ssvc WHERE svc.id = ss.service_id AND ssvc.id = ss.subservice_id AND svc.id = ? 但是,如果要建模一对多关系,则应使用更简单的模式: 服务(就像你拥有的那样) 子服务: CREATE TABLE subservi ...
-
我没有运行代码,但我认为&&操作符可以实现你想要的功能: scope :with_tags, ->(tags) { where("tags && ARRAY[?]", tags) } I'm not running the code but I think the && operator does what you want: scope :with_tags, ->(tags) { where("tags && ARRAY[?]", tags) }
-
假设: 变量@product ,其id = 71 变量@total_price ,其值为40 一个名为current_user的变量/函数 OrderItem belongs_to:order OrderItem belongs_to:orderable,polymorphic:true Order belongs_to:用户 然后我相信它会是这样的: Order. joins(:items). where(items: {id: OrderItem.where(orderable: @produc ...
-
如果适合,你可以试试这个吗? SELECT array_agg(t2.name), array_agg(t1.playerid), date (t1.starttime), Count(t1.starttime) as "# Plays", Count(distinct(t1.playerid)) as "# Stores" FROM public.billing t1 JOIN public.medias t2 on t1.mediaitemid = t2.id JOIN public.players ...
-
问题是,Heroku使用非默认的bytea_output 。 所以解决这个问题的方法是 SET bytea_output = 'hex'; 在运行查询之前 The problem is, that Heroku uses a non-default bytea_output. So a workaround to deal with this was SET bytea_output = 'hex'; before running the query
-
您可能需要括号,因为AND具有运算符优先级。 SELECT * FROM posts WHERE ( title LIKE 'term%' OR NAME LIKE 'term%' ) AND post_type != 'type'; 因为你现在没有括号 SELECT * FROM posts WHERE title LIKE 'term%' OR ( NAME LIKE 'term%' AND post_type != 'typ ...
-
您的查询使用MySQL扩展,允许select列不在group by 。 您可以通过将所有此类列包装在聚合函数(如max()来修复查询: SELECT r.studno, r.sdate, r.subject, sum(exam1) as exam1,sum(exam2) as exam2,sum(asgn1) as asgn1,sum(asgn2) as asgn2, sum(proj1) as proj1,sum(proj2) as proj2,sum(pract1) as p ...