我最近注意到Java在Java中的基本算术运算方面的特殊性.使用以下代码
byte a = 3;
byte b = 4;
byte c = a * b;
Run Code Online (Sandbox Code Playgroud)
我收到"类型不匹配"编译错误...
在Java基本的算术运算(+,-,*,/)只对基本数据类型的执行int和高阶(long,double,等),而在算术运算byte和short是第一投地int,然后评估?
当我第一次学习shell脚本时,我看到很多let用于基本算术的例子,但后来我发现有些环境不是let内置的,而是支持使用expr(尽管速度明显较慢).
但是,例如,在许多shell中也可以使用双括号来执行算术运算$((54 + 102)).
由于我正在编写一个可移植性的脚本,这提供了一个可能性的雷区; 目前我正在使用两个不同的包装函数(一个用于let和一个用于expr),并使用快速测试来决定在我的其余脚本中使用哪个.
无论如何,我想知道的是,是否有人可以澄清这三个算术命令(以及我错过的任何其他算法命令)的兼容性.我希望双括号形式可能足够普通,我可以放弃兼容性检查,但搜索是一件很难的事情,所以我决定来这里并要求确定.
只是要注意我只对常规算术感兴趣,我想我已经涵盖了我可能需要使用的几个大整数.
可能重复:
Python舍入错误与浮点数
python数学是错误的
我不能让Python正确地做减法1 - 0.8并分配它.它一直提出错误的答案,0.19999999999999996.
我探讨了一下:
sq = {}
sub = {}
for i in range(1000):
sq[str(i/1000.)+'**2']=((i/1000.)**2)
sub['1-'+str(i/1000.)]=(1.0-(i/1000.))
Run Code Online (Sandbox Code Playgroud)
并发现这个错误发生在0到1到第三个小数位之间的一个随机的浮点组.当您对这些浮点数进行平方时,也会发生类似的错误,但会出现类似的错误.
我希望对此有一个解释,以及如何使Python正确运算.使用round(x,3)是我现在使用的解决方法,但它并不优雅.
谢谢!
这是我的Python 2.7.3 shell中的一个会话:
*** Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32. ***
*** Remote Python engine is active ***
>>> 1-0.8
0.19999999999999996
>>> print 1-0.8
0.2
>>> a = 1-0.8
>>> a
0.19999999999999996
>>> print a
0.2
>>> a = 0.2
>>> print a
0.2
>>> a
0.2
>>> …Run Code Online (Sandbox Code Playgroud) 我在技术访谈中刚问了一个问题,我有点困惑.
问题如下:
如果
int i = -1, int j = -1, and int k = -1,
Run Code Online (Sandbox Code Playgroud)
我们运行以下行:
++i && ++j && ++k
Run Code Online (Sandbox Code Playgroud)
i,j和k的新值是什么?我感到困惑的原因是,因为我们没有将这个表达式赋值给任何东西,所以看起来并不像运算符应该有任何区别(只有增量运算符应该).然而,运行一个简单的测试程序很快证明我错了.有人可以向我解释这个,因为我之前从未见过这个练习.
我正在寻找一种定义文本表达式的通用方法,它允许验证值.
例如,我有一个值应该只设置为1,2,3,10,11或12.它的约束可以定义为: (value >= 1 && value <= 3) || (value >= 10 && value <= 12)
或者另一个可以是1,3,5,7,9等的值......会有像value % 2 == 1或那样的约束IsOdd(value).
(为了帮助用户更正无效值,我想显示约束 - 所以描述IsOdd性更好.)
这些约束将在客户端(用户输入之后)和服务器端进行评估.因此,多平台解决方案将是理想的(特别是Win C#/ Linux C++).
是否存在允许评估或解析类似简单表达式的现有语言/项目?
如果没有,我可以从哪里开始创建自己的?
我意识到这个问题有点模糊,因为我不完全确定我追求的是什么.搜索结果没有结果,因此即使某些术语作为起点也会有所帮助.然后我可以相应地更新/标记问题.
使用以下代码:
$a=1;
$b=1;
echo $a."%".$b." maradéka: "." = ".$a % $b."<br>";
echo $a."+".$b." összege: "." = ".$a + $b."<br>";
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
1%1 maradéka: = 0
2
Run Code Online (Sandbox Code Playgroud)
如您所见,+语法与%相同,但它不会在操作之前回显文本.也许我太累了或者我不知道,但我无法弄明白:D我到目前为止已经构建了动态网页,但是这个让我感到满意.
我对Scala处理除零的方式感到困惑.这是一个REPL代码片段.
scala> 1/0
java.lang.ArithmeticException: / by zero
... 33 elided
scala> 1.toDouble/0.toDouble
res1: Double = Infinity
scala> 0.0/0.0
res2: Double = NaN
scala> 0/0
java.lang.ArithmeticException: / by zero
... 33 elided
scala> 1.toInt/0.toInt
java.lang.ArithmeticException: / by zero
... 33 elided
Run Code Online (Sandbox Code Playgroud)
正如您在上面的示例中所看到的,取决于您如何除以零,您将获得以下之一:
这使得调试非常具有挑战性,尤其是在处理未知特征的数据时.这种方法背后的原因是什么,甚至更好的问题,如何在Scala中以统一的方式处理除零?
我正在研究Rust手册的第二版,并决定尝试制作经典的Celsius-to-Fahrenheit转换器:
fn c_to_f(c: f32) -> f32 {
return ( c * ( 9/5 ) ) + 32;
}
Run Code Online (Sandbox Code Playgroud)
编译cargo build它将产生编译时错误:
error[E0277]: the trait bound `f32: std::ops::Mul<{integer}>` is not satisfied
--> src/main.rs:2:12
|
2 | return (c * (9 / 5)) + 32;
| ^^^^^^^^^^^^^ the trait `std::ops::Mul<{integer}>` is not implemented for `f32`
|
= note: no implementation for `f32 * {integer}`
Run Code Online (Sandbox Code Playgroud)
作为一个新的Rust程序员,我的解释是我不能将float和integer类型相乘.我通过使所有常量浮点数解决了这个问题:
fn c_to_f(c: f32) -> f32 {
return ( c * ( 9.0/5.0 ) ) + 32.0; …Run Code Online (Sandbox Code Playgroud) 这更像是理解Java对算术运算的评估的理论问题.由于+并-具有相同的优先级,我不太明白Java如何评估以下表达式(两个操作数之间有多个+和-运算符).
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a+-b); // results in -1
System.out.println(a-+b); // results in -1
System.out.println(a+-+b); // results in -1
System.out.println(a-+-b); // results in 3
System.out.println(a-+-+b); // results in 3
System.out.println(a+-+-b); // results in 3
System.out.println(a-+-+-b); // results in -1
System.out.println(a+-+-+b); // results in 3
}
Run Code Online (Sandbox Code Playgroud)
从Java 8语言规范(第15.8.2节):
当应用于两个数值类型的操作数时,binary +运算符执行加法,产生操作数的总和.
二元 - 运算符执行减法,产生两个数字操作数的差异.
[...]
如果操作数表达式没有副作用,则Addition是一个可交换操作.
当操作数都是相同类型时,整数加法是关联的.
我还注意到,每次#operators都是偶数时,结果是相同的,顺序无关紧要.但是当#operators是奇数时,这并不一定会影响结果.例如,在以下两个表达式有一个更-比+ …
为什么下面的代码会这样:
from decimal import Decimal
result = Decimal('0') * Decimal('0.8881783462119193534061639577')
print(result)
Run Code Online (Sandbox Code Playgroud)
返回0E-28?
我已将其追溯到模块中的以下代码:
if not self or not other:
ans = _dec_from_triple(resultsign, '0', resultexp)
# Fixing in case the exponent is out of bounds
ans = ans._fix(context)
return ans
Run Code Online (Sandbox Code Playgroud)
该代码似乎遵循十进制算术规范,它没有明确建议当我们乘以零时要做什么,指的是另一个标准中的“特殊数字” ,它也没有指定当我们将整数乘以零时我们要做什么:) 所以十进制库做了明确指定的事情:
问题:如果其中一个操作数为零,需要返回系数和指数(即0E-28)吗?在调用乘法函数时我们已经知道该系数是多少。为什么不直接返回零呢?
java ×3
math ×2
python ×2
c++ ×1
decimal ×1
echo ×1
evaluation ×1
php ×1
rust ×1
scala ×1
shell ×1
subtraction ×1
validation ×1