好的.我一直在抨击我的头撞墙2个小时,现在试图弄清楚为什么世界double answer = 364/365;上告诉我那answer是0.或者任何其他的双重组合,它只是截断小数而我只是不知道为什么.请帮忙!!!
考虑整数除法
a = bq + r
Run Code Online (Sandbox Code Playgroud)
其中 a、b、q、r 分别为:被除数、除数、商和余数。特别是当 b = 0 时,对于给定的 a,没有唯一的 q 满足方程,因此在这种情况下商 q 应该是未定义的。
但是,在这种情况下确实存在唯一的 r,即 r = a。在商和余数总是一起定义的前提下,当 q 未定义时,r 也没有定义,但是在编程中,我们经常想使用余数运算%而不管除法/。我实际上遇到了我想要的情况if b == 0 then a else a % b end。
是否有/是否有任何编程语言中的运算符,它%与除数为 0 时相同但返回被除数而不是零除法错误?
大多数(或所有)编程语言是否有任何理由为 返回零除法错误% 0?
不同于C,在Java是的结果x/y和x%y良好定义的甚至为负的操作数.令人惊讶的是,它的定义是向零舍入,而不是向下舍入(即向负无穷大).有没有人利用这个定义?
在大多数情况下,我只是不在乎,但有时我不得不解决这个问题,例如,在使用modulo计算索引时array.length.
这不是咆哮,如果有这个定义的用途,我真的很感兴趣.
这是我尝试编写一个函数,将偶数长度列表分成两个相等的一半.
halve :: [a] -> ([a], [a])
halve x
| even len = (take half x, drop half x)
| otherwise = error "Cannnot halve a list of odd length"
where
len = length x
half = len / 2
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
No instance for (Fractional Int) arising from a use of ‘/’
In the expression: len / 2
In an equation for ‘half’: half = len / 2
In an equation for ‘halve’:
Run Code Online (Sandbox Code Playgroud)
我不明白错误,但我怀疑Haskell需要提前告知len是你可以除以2的东西.那么,我该如何纠正这个例子呢?我的代码是否接近惯用的haskell?我很感激有关我的代码的任何其他意见.
我正在为 ARM8 (aarch64) 编写一些汇编代码。我想做一个除法并使用获得的余数进行进一步计算。在 x86 中,当我使用 'div' 时,我知道我的剩余部分保存在RDX 中。我的问题是 - 是否有与 aarch64 指令集中的等价物?我知道 'udiv' 和 'sdiv' 做无符号和有符号的除法,并得到商数。是否有一条指令可以给我余数?(我想要 c 中的 % 模运算符)。我知道我可以使用代数获得它,只是想确认我没有错过更简单的方法。
我编写了这段代码来计算使用欧几里德算法的有理数N的连续分数展开:
from __future__ import division
def contFract(N):
while True:
yield N//1
f = N - (N//1)
if f == 0:
break
N = 1/f
Run Code Online (Sandbox Code Playgroud)
如果说N是3.245,则函数永远不会结束,因为显然f永远不等于0.扩展的前10个术语是:
[3.0,4.0,12.0,3.0,1.0,247777268231.0,4.0,1.0,2.0,1.0]
这显然是一个错误,因为实际扩展只是:
[3; 4,12,3,1]或[3; 4,12,4]
是什么原因引起了这个问题?这是某种舍入错误吗?
python division integer-division fractions continued-fractions
在python中进行大量分割时,我遇到了一个奇怪的情况.
int(1012337203685477580 / 2) = 506168601842738816
Run Code Online (Sandbox Code Playgroud)
和
int(1012337203685477580 >> 1) = 506168601842738790
Run Code Online (Sandbox Code Playgroud)
为什么两种方法之间存在差异?int()似乎至少是int64,因为int(2 ^ 63 - 1)和2 ^ 63 - 1是相同的值.
我正在尝试从PGExercises.com解决这个特殊问题:
https://www.pgexercises.com/questions/aggregates/rankmembers.html
问题的要点是我给了一张他们预订的俱乐部会员和半小时时间表(获得列表是两个表的简单INNER JOIN).
我应该按照预订的总时数产生一个递减的会员排名,四舍五入到最接近的10.我还需要使用RANK()窗口函数生成具有等级的列,并按等级对结果进行排序.(结果产生30条记录.)
作者非常优雅的解决方案是这样的:
select firstname, surname, hours, rank() over (order by hours) from
(select firstname, surname,
((sum(bks.slots)+5)/20)*10 as hours
from cd.bookings bks
inner join cd.members mems
on bks.memid = mems.memid
group by mems.memid
) as subq
order by rank, surname, firstname;
Run Code Online (Sandbox Code Playgroud)
不幸的是,作为一个SQL新手,我非常不优雅的解决方案更复杂,使用CASE WHEN和转换数字到文本,以查看最后一个数字,以决定是向上舍入还是向下舍入:
SELECT
firstname,
surname,
CASE
WHEN (SUBSTRING(ROUND(SUM(slots*0.5),0)::text from '.{1}$') IN ('5','6','7','8','9','0')) THEN CEIL(SUM(slots*0.5) /10) * 10
ELSE FLOOR(SUM(slots*0.5) /10) * 10 …Run Code Online (Sandbox Code Playgroud) 似乎为了在 Java 中找到除法的商和余数,必须这样做:
int a = ...
int b = ...
int quotient = a / b;
int remainder = a % b;
Run Code Online (Sandbox Code Playgroud)
有没有办法写这个,以便在一个步骤(一个除法运算)中找到商和余数?或者 Java 是否已经自动优化了这些代码?
EDIT2:正如@ShadowRanger指出的那样,这是一种Numpy现象,而不是Python。但是,当在Python中使用列表推导进行计算(因此x+y变为[a+b for a,b in zip(x,y)])时,所有算术运算仍会花费同样长的时间(尽管是Numpy的100倍以上)。但是,当我在真实的仿真中使用整数除法时,它们的运行速度会更快。因此,主要问题仍然存在:即使在Python中,为什么这些测试表明整数除法没有比常规除法更快?
EDIT1:版本:Python 3.5.5,Numpy 1.15.0。
似乎在Python Numpy中,整数除法比(整数的)正规除法更昂贵,这是违反直觉的。测试时,我得到以下信息:
setup_string = 'import numpy as np;\
N=int(1e5);\
x=np.arange(1,N+1, dtype=int);\
y=np.arange(N, dtype=int);'
Run Code Online (Sandbox Code Playgroud)
加法(+)〜0.1s
timeit("x+y", setup=setup_string, number=int(1e3))
0.09872294100932777
Run Code Online (Sandbox Code Playgroud)
减法(-)〜0.1s
timeit("x-y", setup=setup_string, number=int(1e3))
0.09425603999989107
Run Code Online (Sandbox Code Playgroud)
乘法(*)〜0.1s
timeit("x*y", setup=setup_string, number=int(1e3))
0.09888673899695277
Run Code Online (Sandbox Code Playgroud)
除(/)〜0.35s
timeit("x/y", setup=setup_string, number=int(1e3))
0.3574664070038125
Run Code Online (Sandbox Code Playgroud)
整数除(//)〜1s(!)
timeit("x//y", setup=setup_string, number=int(1e3))
1.006298642983893
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?为什么整数除法不快?
python performance numpy integer-division integer-arithmetic
integer-division ×10
division ×4
java ×3
python ×3
integer ×2
arm ×1
arm64 ×1
assembly ×1
double ×1
fractions ×1
haskell ×1
long-integer ×1
modulo ×1
numpy ×1
performance ×1
postgresql ×1
python-3.x ×1
rounding ×1
sql ×1