V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  CRVV  ›  全部回复第 1 页 / 共 27 页
回复总数  535
1  2  3  4  5  6  7  8  9  10 ... 27  
顺便一说

十进制
99.1*1.005 = 99.5955
round(99.5955, 3) = 99.596
我猜 Excel 能得到这个结果

Ruby
irb(main):005:0> (99.1*1.005).round(3)
=> 99.595

其它语言当然也是 99.595
这两个浮点数的精确值,实际上
99.1*1.05 是 104.0549999999999926103555480949580669403076171875
104.055 是 104.05500000000000682121026329696178436279296875
这两个数字之间没有其它的 float64 了

这两个数字都不是刚好一半的情况,所以和舍入规则没关系
不论用不用 银行家舍入,round(99.1*1.05, 2) 都是 104.05 ,round(104.055, 2) 都是 104.06

Excel 可能是把 99.1*1.05 的结果直接算成了后面那个 104.05500000000000682121026329696178436279296875 ,然后再 round 当然就得到了 104.06
Excel 应该也能正确处理各种 .1+.2 == .3 的情况

这个问题在 Python 文档里面说得很清楚,https://docs.python.org/3/library/functions.html#round

> Note: The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.


Ruby 好像是额外处理了这种情况,Ruby 的 2.675.round(2) 是 2.68

irb(main):001:0> 104.054999999999978399500832892954349517822265625.round(2)
=> 104.05
irb(main):002:0> 104.0549999999999926103555480949580669403076171875.round(2)
=> 104.06
这个行为对我来说很 surprising ,还没写在文档里面。
https://ruby-doc.org/core-2.5.1/Float.html#method-i-round
39 天前
回复了 QGabriel 创建的主题 Android 安卓手机拍照有能跟 iPhone 媲美的吗
@Worldispow

你说的 hdr 和他说的 hdr 是完全不相关的两个东西。
https://en.wikipedia.org/wiki/High_dynamic_range
你说的是 Capture ,他说的是 Storage

我大概查了一下,三星 Galaxy S23 Ultra 都不支持他说的 hdr
https://eu.community.samsung.com/t5/galaxy-s23-series/is-there-any-chance-to-get-ultra-hdr-hdr-hdr10-support-in-galaxy/td-p/8543523
人家来招聘,工资工时都说清楚了,招得到就招,招不到也是公司自己的事情,没什么值得争论的。

但是,对软件工程师这个职业来说,通常工资越高的人性价比越高。8k 工资在深圳招的人,在我看来价值基本上就是负的。工作经验其实也没什么大用,2 年经验和 5 年经验差不多的,如果限定工资 8k ,我还觉得招个本科生会更靠谱。
@wu67
神经病定价的华润其实很好的,他家神经病价格的东西几乎都对得起价格,比如水果牛奶牛肉和挂面。
有一个青海的牛奶,1L 装的大概 35 ,这个牛奶大约是能在零食店买到的最好的牛奶,没有范围。乌鲁木齐也有类似品质的牛奶,1L 的价格是 10 块钱。

如果对这种神经病价格的商品没有需求,那山姆就还不错吧,虽然我也对山姆不感兴趣。
山姆的牛肉在沃尔玛也经常有卖。
性价比和面子都不是能简单评价的指标。

A80 Supra 和 A90 Supra 和 BMW Z4 ,哪个有面子?
简单来说,面子也分两种,贵和稀少。你开个深圳很少见的车,我觉得 mx-5 在深圳就挺有面子的。panamera 烂大街了,感觉就很普通。如果大家都是 porsche ,深圳的 911 远比其它 porsche 罕见,那我觉得你开一个最低配的 911 也远比顶配卡宴/panamera 有面子。

说到电车,在某些情况下电车的性价比非常高,可能 model 3 比两三倍价格的油车都好。但是在某些情况下 100 万的电车还不如 3 万的五菱。
油车也分很多种不同倾向的,如果只考虑实用性,30 万差不多足够买到性能非常够用的车了,但也要看实用性上的需求具体在哪里。

楼主没说使用场景,也没说需要哪种面子,真没法评价。
如果能接受 OLED ,我觉得楼主应该去店里看一下,直接看能接受哪个屏幕就行。
13456 都可以直接在网上查到,2 要看自己能不能接受,每个人的标准都不一样,只有看到货了才能知道。
我自己觉得 Sony 的 OLED 还可以,能接受。

除了系统,iPhone se 应该符合楼主的要求,屏幕是完全不闪的高级 LCD ,我自己在用,我也看不出来它哪里不如 OLED 。问题是没有厂商还在做这种屏幕的高端机器了。
@rockyliang

程序员写代码不需要懂这么多的东西,如果你想深究这些知识,当然可以学,这些东西都还挺有意思的,但这些知识和 “写正确的代码” 不相关。让程序员不需要懂这些东西就能写代码,就是所谓 高级语言 的功能。

计算机这东西在各个领域都是分层的,设计 HTTP 协议的人不需要懂 IP 协议要怎么工作,他只需要懂 TCP 协议就行。CPU 指令和编程语言也是类似的情况,写代码的人只需要懂编程语言,不需要懂 CPU 的工作方式,不需要懂编译器的实现细节。
重复一下,你想学当然可以学,但这些知识不能帮你把代码写对。把代码写对需要的是编程语言本身的知识。

你举的例子说 flag = false 没有生效,这件事情的原因,如果非要深究到底,那确实是这一句被编译器优化掉了。
编译器把它优化掉了,这个叫 实现细节,编译器优化掉它,是因为根据编程语言的 spec ,flag = false 这一句可以被优化掉。编译器可以优化掉它,也可以不优化。
经常出现的一种情况是,程序员写了一段带有 undefined behavier 的代码,跑了一下发现一切正常,就认为代码是对的,之后升级了编译器程序就挂了。

从编程语言的角度来说 flag = false 没有被执行到的原因,或者说编译器可以把它优化掉的原因是
这两个 for 循环执行在不同的 goroutine 上,而且 Go 没有保证 goroutine 的执行顺序,也不保证 goroutine 被执行到。
for flag print sleep 的那个循环一直占用着 CPU ,sleep 的实现是忙等,而后面的 for 循环从来都没有执行到,这是一种符合 spec 的行为。
或者 for flag print sleep 的循环要执行了一亿亿亿次以后才会执行到后面的 for ,这也符合 spec
两个 goroutine 同时对一个变量做读写操作,这个叫 data race ,当然是 undefined behavier

两个线程不能同时读写同一个变量,这个算基础知识吧
这些可见性的问题,实际上属于 Instruction Set Architecture (ISA),不属于编程语言。
每个 CPU 指令集都定义了自己的 CPU 上哪些内存操作在什么情况下可见,都不一样的,这是问题非常复杂。

一个高级程序设计语言,像 C 这种的,当然不需要程序员去处理不同 CPU 的不同行为,不然它就不叫 高级 语言了。
对这些内存操作的行为,高级语言必须有统一的定义,让这个语言写的程序在不同 ISA 上能得到相同的结果。这个定义叫做 memory model ,比如
https://en.cppreference.com/w/c/language/memory_model
https://en.wikipedia.org/wiki/Java_memory_model
https://go.dev/ref/mem

存在 cache 的情况确实会有不可见的问题(考虑一下 CPU 上没有 cache ,所有 core 直接写到主内存上的情况)。但你看 Go memory model 里面根本没出现过 cache 这个词。
就是说 Go 的这套定义里面,就没有 cache 这个东西。Go 的定义里面,程序的行为就像没有 cache 一样(因为他的文档里就没写 cache 的事),所以只要一个 write 发生在 read 之前,且这个 write 之后 read 之前没有发生其它的 write ,这个 write 就被这个 read 可见。
所以这个文档全在讨论顺序的问题。

楼主发的代码显然有明确的执行顺序,这个顺序显然满足上面的要求,所以内存操作是可见的。


顺便一说,程序员不需要知道 ISA 上的这些定义,这本来就是个高端问题。但是 x86 上的内存操作的行为特别简单,所以总有人写代码的时候依赖于这些 x86 的行为,实际上写的代码都是 undefined behavior ,还觉得自己特别厉害,写文章讲解什么内存可见性的问题,估计楼主是这种东西的受害者。
129 天前
回复了 realpg 创建的主题 程序员 一次 github 跟开源大佬的抬杠经历
@Rehtt
@stinkytofu
在这件事情上,一个弹窗应该把其它所有东西都挡住。
比如 Windows 上请求管理员权限的弹窗,甚至会把所有东西(包括不重叠的东西)都置灰。这个网页上有很多例子。
https://learn.microsoft.com/en-us/windows/security/application-security/application-control/user-account-control/how-it-works

或者退一步,弹窗是一个整体,那个下划线和下划线对应的文字是另一个整体。这两个整体的东西不应该交错,要么 A 在上面,要么 B 在上面。A 的大部分都在 B 的下面,有一小部分在 B 的上面,这不是正常行为。

或者再退一步,现在要把 B 放在 A 上面但是需要开一个天窗,我认可有这样的需求。但我不认可有人需要开天窗显示出来一条下划线,而且我不认可“开天窗”是一个常见且普通的需求。

所以,一条下划线被显示在一个弹窗的上面,是一个 bug 。
我觉得这个点本来就很清楚,我真不懂为什么需要这样长篇地解释一件非常浅显的事情。
130 天前
回复了 realpg 创建的主题 程序员 一次 github 跟开源大佬的抬杠经历
从 GitHub 的 issue 来看,属于很明显的 bug
问题很简单,其实就一句话

弹窗没把该挡住的东西挡住


讨论 z-index 就变成 xy 问题了,需求是该挡的东西都要挡住,z-index 是 y 问题

不同的人对待软件的态度不一样,比如有人说
> 明明可以传入 zindex 解决的问题

问题在于,有的人会以更认真的态度对待工程问题。
苹果之前的键盘会坏,当然可以说 “找售后换一台就能解决”,不过我们还是希望键盘本来就不坏。
某某车的发动机烧机油,也可以说 “机油不够了补上就能解决”,那有的车企还是会让发动机本来就不烧机油。

这个项目的人明显没打算修,指着糊弄过去就完事了,确实说了一大堆看起来友善专业的话,但实际上放着一个明显的 bug 却没有要修的意思。也算不上大厂风范吧,很多人就是没那么认真而已。
这就是常规情况,不值得这样,我都直接走人的。
158 天前
回复了 xuegy 创建的主题 职场话题 第一次当“面试官”的感受
@forgottenPerson
@iOCZ

学好数学需要的能力和写代码需要的能力不一样。能学好数学的人不一定能写好代码,反过来也一样

学数学需要的能力大约是做算法题的能力,有人能做从没做过的算法题,这种人通常能轻松学好数学。
做算法题需要 凭空 想出来一个解法,这个解法不能或者很难从题目中 推理 得到。

但是实际写代码需要 推理能力,实际问题的实现方式都可以从需求推理得到。
工作中经常花费大量时间在解决 bug 上,大多数情况下,解决 bug 需要的就是在一个很长的逻辑链条上做推理,这种推理对大多数人来说非常困难,但也有人做起来很容易。所以经常会出现一个 bug 有人花了一周没解决,换另一个人来半天就搞定了。
Advent of Code 的题目也是这一类的,所以有的题目别人用时一二十分钟,自己来写可能要写一整天。

总之这是两种很不一样的能力,所以经常有某著名软件工程师面试算法题没过这种事情。
@wniming
16 个寄存器需要 4 位来编码,31 个需要 5 位,这个应该是最主要的原因。
比如 inc eax 只需要 1 个 byte ( 8 位)来编码。如果寄存器需要 5 位,就不太可能放在 1 byte 里面。( ARM 好像也没有 inc 这个指令)
所谓 CISC ,是指在一条指令里面可以同时访问内存和做运算。比如 add eax, (ecx),是 eax += *ecx ,这条指令在 x86 上面只占 2 bytes
在 RISC 上面需要先 load edx, (ecx),再做加法 add eax, edx ,RISC 上面这两条指令很可能都要 4 bytes ,一共 8 bytes 。而且 load ecx 需要多用一个寄存器 edx 来保存结果。也就是 RISC 需要更多的寄存器来做到的 CISC 一样的事情。
指令短是 CISC 的一个重要设计目标,到 RISC 的年代不在乎这个事了,所以有这个差别。

CPU 实际有多少个寄存器和指令上定义的寄存器数量无关,CPU 有一部分专门来处理这个事情
https://en.wikipedia.org/wiki/Register_renaming
加密短的数据不可能耗时达到毫秒级
openssl speed -evp aes-128-gcm -bytes 16
在我的机器上只需要 16ns ,这个测试的结果显然没有包含访问主内存的时间(已经在一级缓存上)

自创的加密算法安全不安全?这个问题有标准答案,不安全
在某个项目上是不是适用? 1 楼也已经答了,对没有价值的数据适用
有多大可能被破解?这个得给钱,不然不可能有高手帮你评估破解难度
172 天前
回复了 cnbatch 创建的主题 C++ Intel x86-simd-sort“故意”对 AMD 负优化?
@yzbythesea

我本来也想说这部分代码 "pretty much directly copied over from Intel's own implementation"
但是查了一下 commit 的作者
https://github.com/openjdk/jdk/commit/a4e9168bab1c2872ce2dbc7971a45c259270271f
https://github.com/vamsi-parasa

他的 GitHub 上写着 Intel ,那我只能认为这个事情是 Intel 干的了。
不过 openjdk 这种大项目理应自己认真测过再合并,结果没有。
这里有另外一个原因
比如
create table test(x int unique, y int unique, z int);
insert into test select 1, 1, 1;
insert into test select 2, 2, 2;
insert into test select 3, 3, 3;

然后执行 upsert ,insert into test select 1, 2, 3 on conflict do nothing;
这样当然没问题

如果要 returning 冲突的结果,insert into test select 1, 2, 3 on conflict do nothing returning *;
你希望它返回这个结果么?通常不期望这个结果,在 unique 的东西上只返回一行比较符合直觉。另外要返回这个结果的话,数据库需要把所有的 unique constraint 都扫一遍。
x | y | z
---+---+---
1 | 1 | 1
2 | 2 | 2
(2 rows)

如果要 update ,insert into test select 1, 2 on conflict do update set z = 0;(当然这一句执行不了,do update 需要有一个指定的 unique constraint ,叫 conflict_target )
你希望它把表修改成这样么?同上,通常也不期望这个结果。
x | y | z
---+---+---
1 | 1 | 0
2 | 2 | 0
3 | 3 | 3
(3 rows)

这个功能的设计应该是说在 do update 的时候只修改一行,所以必须指定 conflict_target
要写成 insert into test select 1, 2, 0 on conflict (x) do update set z = 0;
表被修改成
x | y | z
---+---+---
2 | 2 | 2
3 | 3 | 3
1 | 1 | 0
(3 rows)

当然楼主写的 SQL 里面有指定 conflict_target ,但有没有 conflict_target 的结果需要做成一致的,所以只有现在这样应该是唯一的合理结果。
https://en.m.wikipedia.org/wiki/Timestamp

timestamp 指的是邮戳上那种日期时间。

邮戳上当然不写时区,SQL 标准里面的 timestamp 类型也不带时区。如果你永远在一个不带夏令时的时区里面,就可以用这个类型。但数据库不知道这个时间是哪个时区的,你可以写在代码里面或者在系统上设置。单看这个时间戳本身,实际上不知道它具体是什么时间。

如果给上面说的这种戳加上时区,比如
2024-05-06 19:20:21 +10
那么这个戳就是一个具体确定的时间,这个类型在 postgres 里面叫 timestamp with time zone
postgres 只关心它具体是什么时间,你输入进去的时区不重要,也没有存。
这个类型实际上就是 unix time ,并且在输入输出的时候帮你转换字符串。

还有个 time with time zone 类型,文档里说了这个类型根本没用,也是 SQL 标准里面的。
@nevadax

有的公司完全不支持远程,有的公司全员远程,也有的公司一半远程

如果你觉得远程是好事,和不支持远程的公司相比,你应该更喜欢一半远程的公司才对,当然全员远程的更好。
如果要喷,也是到不支持远程的公司发的帖子下面去喷,“你们这什么垃圾公司居然不支持远程”。

支持远程的公司本来就是少数,能支持一半已经很好了
请不要走这种极端路线,一说远程工作就要全员无条件远程工作,一说开放就是在药和疫苗都没有的情况下全体无条件开放
1  2  3  4  5  6  7  8  9  10 ... 27  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3195 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 37ms · UTC 00:38 · PVG 08:38 · LAX 17:38 · JFK 20:38
Developed with CodeLauncher
♥ Do have faith in what you're doing.