<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: LegionMammal978</title><link>https://news.ycombinator.com/user?id=LegionMammal978</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 11 Jun 2026 10:08:02 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=LegionMammal978" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by LegionMammal978 in "What Do Gödel's Incompleteness Theorems Mean?"]]></title><description><![CDATA[
<p>To be fair, in the most literal sense, the vast majority of syntactically-valid statements in a typical FOL encoding will be trivial. One of my side-projects has been trying to find the shortest statements independent of ZF and some of its fragments. In fact, for every slightly nontrivial statement that requires actually building a construction, there are billions more that can be instantly solved via a few simplifications, and statically pruning the search tree a bit is the best we can do.<p>To actually get independence, we need very rigid statements that don't allow any simple way to fudge a solution or counterexample. If anything, statements that mathematicians (and programmers) care about are biased toward undecidability, simply because they're extremely biased toward nontriviality. We put in the hard work of building towers of rigid definitions to that effect.</p>
]]></description><pubDate>Fri, 22 May 2026 16:02:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=48237713</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48237713</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48237713</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "I hate soldering"]]></title><description><![CDATA[
<p>I always thought of it as analogous to the silent Ls in <i>would</i>/<i>should</i>/<i>could</i>, <i>calf</i>, <i>half</i>, <i>chalk</i>, <i>caulk</i>, and <i>Polk</i>.</p>
]]></description><pubDate>Tue, 12 May 2026 13:45:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=48108214</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48108214</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48108214</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Building a web server in aarch64 assembly to give my life (a lack of) meaning"]]></title><description><![CDATA[
<p>I did actually make an attempt at that once for BGGP5 [0]. (That is, making a minimal, horribly insecure 'client' implementing just enough behavior to get a response from a server.) But I got demoralized by how much space the binary blobs for the crypto algorithms took up, in comparison to the actual machine code.<p>[0] <a href="https://binary.golf/5/" rel="nofollow">https://binary.golf/5/</a></p>
]]></description><pubDate>Mon, 11 May 2026 15:44:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=48096541</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48096541</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48096541</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Floats Don't Agree with Themselves"]]></title><description><![CDATA[
<p>Alas, compilers have historically fudged the behavior on some 32-bit targets, e.g., x86 targets without SSE2 [0], so you'd have to go all the way to soft-float implementations if you really want guarantees. But these targets are rare, and very unlikely to be the cause of the original issue.<p>(And NaN payloads in general are a mess across platforms and ABIs, but that can be solved by treating all NaNs as identical.)<p>[0] <a href="https://github.com/rust-lang/rust/issues/114479" rel="nofollow">https://github.com/rust-lang/rust/issues/114479</a></p>
]]></description><pubDate>Fri, 08 May 2026 12:48:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=48062299</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48062299</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48062299</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Floats Don't Agree with Themselves"]]></title><description><![CDATA[
<p>At least the Rust compiler (TFA's project is written in Rust) tries to configure LLVM specifically to avoid these discrepancies, and to treat all basic floating-point operations exactly as written with round-to-nearest behavior [0]. It does not have any of the -ffast-math options that the author('s LLM) is panicking about.<p>The main caveat is that on x86 targets without SSE2, LLVM is deeply wired to use the x87 instructions without attempting to emulate the IEEE overflow/underflow behavior [1]. So perhaps it could be possible to exhibit a discrepancy, but only by compiling for i586 and an ancient target-cpu. It's very doubtful that this was the cause of the original client vs. server issue in TFA's introduction.<p>[0] <a href="https://rust-lang.github.io/rfcs/3514-float-semantics.html" rel="nofollow">https://rust-lang.github.io/rfcs/3514-float-semantics.html</a><p>[1] <a href="https://github.com/rust-lang/rust/issues/114479" rel="nofollow">https://github.com/rust-lang/rust/issues/114479</a></p>
]]></description><pubDate>Fri, 08 May 2026 12:20:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=48062039</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48062039</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48062039</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Floats Don't Agree with Themselves"]]></title><description><![CDATA[
<p>Yeah, in general, this is a problem that people have spent a lot of time thinking about; while floating-point numbers can be finicky, they're what you have to work with if you have inputs at multiple scales.<p>(Meanwhile, I wonder why it's a fair bit harder to look up Ozaki et al.'s optimized version [0] compared to Shewchuk's original paper [1], unless perhaps later authors have found it to be no improvement at all.)<p>[0] <a href="https://www.tuhh.de/ti3/paper/rump/OzBueOgOiRu15.pdf" rel="nofollow">https://www.tuhh.de/ti3/paper/rump/OzBueOgOiRu15.pdf</a><p>[1] <a href="https://people.eecs.berkeley.edu/~jrs/papers/robust-predicates.pdf" rel="nofollow">https://people.eecs.berkeley.edu/~jrs/papers/robust-predicat...</a></p>
]]></description><pubDate>Fri, 08 May 2026 12:05:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=48061903</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48061903</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48061903</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "sRGB profile comparison"]]></title><description><![CDATA[
<p>sRGB has bugged me from the start, since it's not even clear to me which actual matrix to use to convert between linear sRGB colors and XYZ colors. I count at least 3 different matrices in IEC 61966-2-1, each of which I have seen different people ascribe to as the true version:<p>1. The matrix implied by the reference primaries in Table 1: [X; Y; Z] = [506752/1228815, 87098/409605, 7918/409605; 87881/245763, 175762/245763, 87881/737289; 12673/70218, 12673/175545, 1001167/1053270]*[R; G; B].<p>2. The matrix in section 5.2: [X; Y; Z] = [1031/2500, 447/1250, 361/2000; 1063/5000, 447/625, 361/5000; 193/10000, 149/1250, 1901/2000]*[R; G; B].<p>3. The inverse of the matrix in section 5.3: [X; Y; Z] = [248898325000/603542646087, 71938950000/201180882029, 36311670000/201180882029; 128304856250/603542646087, 143878592500/201180882029, 14525360000/201180882029; 11646692500/603542646087, 23977515000/201180882029, 191221850000/201180882029]*[R; G; B].<p>The distinction starts to matter for 16-bit color. The CSS people seem to take the position that the matrix implied by primaries is the true version, but meanwhile, the same document's Annex F (in Amd. 1) seems to suggest that the 5.2 matrix is the true version, and that the 5.3 matrix should be rederived to the increased precision. There's no easy way to decide, as far as I can tell.<p>Meanwhile, I agree with the author that the ICC's black-point finagling in their published profiles has not helped with the confusion over what exactly sRGB colors are supposed to map to.</p>
]]></description><pubDate>Tue, 05 May 2026 13:55:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=48022593</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48022593</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48022593</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Buffon's needle problem visualized"]]></title><description><![CDATA[
<p>You can pick a uniform random orientation without trig functions by first generating a random point in the unit disk via rejection sampling, then projecting it onto the boundary [0].<p>Of course, using rejection sampling for disk points will give you an estimate for π more directly.<p>[0] <a href="https://mathworld.wolfram.com/CirclePointPicking.html" rel="nofollow">https://mathworld.wolfram.com/CirclePointPicking.html</a></p>
]]></description><pubDate>Tue, 05 May 2026 01:39:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=48017089</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=48017089</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48017089</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Unsigned sizes: A five year mistake"]]></title><description><![CDATA[
<p>> But what about the range? While it’s true that you get twice the range, surprisingly often the code in the range above signed-int max is quite bug-ridden. Any code doing something like (2U * index) / 2U in this range will have quite the surprise coming.<p>Alas, (2S * signed_index) / 2S will similarly result in surprises the moment the signed_index hits <i>half</i> the signed-int max. There's no free lunch when trying to cheat the integer ranges.</p>
]]></description><pubDate>Sat, 02 May 2026 19:14:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=47989473</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47989473</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47989473</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "What can we gain by losing infinity?"]]></title><description><![CDATA[
<p>> However, an axiom of infinity is independent, it doesn’t contradict anything in standard formalizations, and so it doesn’t make sense to say “infinity is wrong”.<p>Suppose we start with ZFC - Infinity as our base system. Then the negation of Infinity is consistent with this system. But adding Infinity itself makes the system strictly stronger, since ZFC proves the consistency of ZFC - Inf: in particular, in ZFC, we <i>cannot</i> prove that Infinity is consistent with ZFC - Inf.<p>In other words, in principle, it might be the case that ZFC - Inf is consistent, yet ZFC itself has a contradiction. In practice, most people believe that ZFC is also consistent, but we have no way to <i>prove</i> it a priori without accepting even more new axioms.</p>
]]></description><pubDate>Thu, 30 Apr 2026 17:02:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47965338</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47965338</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47965338</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Bitwarden CLI compromised in ongoing Checkmarx supply chain campaign"]]></title><description><![CDATA[
<p>> The implicit update surface is <i>somewhat</i> limited by the fact that versions in Cargo.toml implicitly assume the `^` operator on versions that don't specify a different operator, so "1.2.3" means "1.2.x, where x >= 3". For reasons that have never been clear to me, people also seem to really like not putting the patch version in though and just putting stuff like "1.2", meaning that anything other than a major version bump will get pulled in.<p>Not quite: "1.2.3" = "^1.2.3" = ">=1.2.3, <2.0.0" in Cargo [0], and "1.2" = "^1.2.0" = ">=1.2.0, <2.0.0", so you get the "1.x.x" behavior either way. If you actually want the "1.2.x" behavior (e.g., I've sometimes used that behavior for gmp-mpfr-sys), you should write "~1.2.3" = ">=1.2.3, <1.3.0".<p>[0] <a href="https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#default-requirements" rel="nofollow">https://doc.rust-lang.org/cargo/reference/specifying-depende...</a></p>
]]></description><pubDate>Fri, 24 Apr 2026 00:19:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47883964</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47883964</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47883964</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "XOR'ing a register with itself is the idiom for zeroing it out. Why not sub?"]]></title><description><![CDATA[
<p>Traditionally in x86, only the first byte is the opcode used to select the instruction, and any further bytes contain only operands. Thus, since there exist 256 possible values for the initial byte, there are at most 256 possible opcodes to represent different instructions.<p>So if you add a 1-byte instruction for each register to zero its value, that consumes 8 of the possible 256 opcodes, since there are 8 registers. Traditional x86 did have several groups of 1-byte instructions for common operations, but most of them were later replaced with multibyte encodings to free up space for other instructions.</p>
]]></description><pubDate>Wed, 22 Apr 2026 14:00:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47863790</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47863790</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47863790</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "The smallest ELF executable (2021)"]]></title><description><![CDATA[
<p>Try 81 bytes for an x86-64 executable, or 77 bytes for the same if you run it on a VM with 5-level paging: <a href="https://tmpout.sh/3/22.html" rel="nofollow">https://tmpout.sh/3/22.html</a></p>
]]></description><pubDate>Sat, 04 Apr 2026 22:16:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47644080</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47644080</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47644080</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "New patches allow building Linux IPv6-only"]]></title><description><![CDATA[
<p>Even in a NAT-less world, the common advice is to use a firewall rule that disallows incoming connections by default. (And I'd certainly be worried if typical home routers were configured otherwise.) So either way, you'd need the average person to mess with their router configuration, if they want to allow incoming P2P connections without hole-punching tricks. At best, the lack of NAT might save you an address-discovery step.</p>
]]></description><pubDate>Wed, 01 Apr 2026 15:50:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47602501</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47602501</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47602501</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Coding agents could make free software matter again"]]></title><description><![CDATA[
<p>> The LLM can a priori test on all possible software and hardware environments, test all possible edge cases for deployment, get feedback from millions of eyes on the project explicitly or implicitly via bug reports and usage, find good general case use features given the massive amounts of data gathered through the community of where the project needs to go next, etc?<p>Even if that's the ideal (and a very expensive one in terms of time and resources), I really don't think it accurately describes the maintainers of the very long tail of small open-source projects, especially those simple enough for the relevant features to be copied into a few files' worth of code.<p>Like, sure, projects like Linux, LLVM, Git, or the popular databases may fit that description, but people aren't trying to vendor those via LLMs (or so I hope). And in any case, if the project presently fulfills a user's specific use case, then it "going somewhere next" may well be viewed as a persistent risk.</p>
]]></description><pubDate>Mon, 30 Mar 2026 17:58:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=47577591</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47577591</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47577591</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Coding agents could make free software matter again"]]></title><description><![CDATA[
<p>> But the users would have to maintain their own forks then.<p>I suppose the idea would be, they <i>don't</i> have to maintain it: if it ever starts to rot from whatever environmental changes, then they can just get the LLM to patch it, or at worst, generate it again from scratch.<p>(And personally, I prefer writing code so that it isn't coupled so tightly to the environment or other people's fast-moving libraries to begin with, since I don't want to poke at all of my projects every other year just to keep them functional.)</p>
]]></description><pubDate>Sun, 29 Mar 2026 23:58:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=47568762</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47568762</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47568762</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Even faster asin() was staring right at me"]]></title><description><![CDATA[
<p>Just looking at the formula in the code (and the book it came from), we see that the approximation is of form arcsin(x) = π/2 - P(x)*sqrt(1-x). It is called a minimax solution in both, and the simplest form of minimax optimization is for polynomials. So we look at P(x) = (π/2 - arcsin(x))/sqrt(1-x): plotting out its error function with the original coefficients, it has the clear equioscillations that you'd expect from an optimized polynomial, i.e., each local peak has the exact same height, which is the max error. But if we look at the error curve in terms of arcsin(x), then its oscillations no longer have the same height, which indicates that the approximation can be improved.</p>
]]></description><pubDate>Tue, 17 Mar 2026 13:48:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=47412642</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47412642</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47412642</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Even faster asin() was staring right at me"]]></title><description><![CDATA[
<p>Actually, we can improve this a bit further, by also adjusting the "π/2" constant in arcsin(x) = π/2 - P(x)*sqrt(1-x). We take coefficients [1.5707256467180715, -0.21298179775496026, 0.07727939759417458, -0.02132102849918157] for P(x), then take arcsin(x) = 1.570760986756484 - P(x)*sqrt(1-x). This reduces the max error by 6.97%, from 3.80e-5 to 3.53e-5.<p>Adjusting the "1" upward in sqrt(1-x) does not seem to help at all.</p>
]]></description><pubDate>Tue, 17 Mar 2026 04:00:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=47408443</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47408443</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47408443</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Even faster asin() was staring right at me"]]></title><description><![CDATA[
<p>The coefficients given are indeed a near-optimal cubic minimax approximation for (π/2 - arcsin(x))/sqrt(1-x) on [0,1]. But those coefficients aren't actually optimal for approximating arcsin(x) itself.<p>For reference, the coefficients given are [1.5707288, -0.2121144, 0.0742610, -0.0187293]: if we optimize P(x) = (π/2 - arcsin(x))/sqrt(1-x) ourselves, we can extend them to double precision as [1.5707288189560218, -0.21211524058527342, 0.0742623449400704, -0.018729868776598532]. Increasing the precision reduces the max error, at x = 0, by 0.028%.<p>Adjusting our error function to optimize the absolute error of arcsin(x) = π/2 - P(x)*sqrt(1-x) on [0,1], we get the coefficients [1.5707583404833712, -0.2128751841625164, 0.07689738736091772, -0.02089203710669022]. The max error is reduced by 44%, from 6.75e-5 to 3.80e-5. If we plot the error function [0], we see that the new max error is achieved at five points, x = 0, 0.105, 0.386, 0.730, 0.967.<p>(Alternatively, adjusting our error function to optimize the <i>relative</i> error of arcsin(x), we get the coefficients [1.5707963267948966, -0.21441792645252514, 0.08365774237116316, -0.02732304481232744]. The max absolute error is 2.24e-4, but the max relative error is now 0.0181%, even in the vicinity of the root at x = 0. Though we'd almost certainly want to use a different formula to avoid catastrophic cancellation.)<p>So it goes to show, we can nearly double our accuracy, without modifying the code, just by optimizing for the right error metric.<p>[0] <a href="https://www.desmos.com/calculator/nj3b8rpvbs" rel="nofollow">https://www.desmos.com/calculator/nj3b8rpvbs</a></p>
]]></description><pubDate>Mon, 16 Mar 2026 20:54:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47404736</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47404736</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47404736</guid></item><item><title><![CDATA[New comment by LegionMammal978 in "Why Mathematica does not simplify sinh(arccosh(x))"]]></title><description><![CDATA[
<p>Even for boolean logic problems, a minimum-size CNF or DNF will not necessarily be the cheapest solution in terms of gates. As far as I know, hardly anyone has even attempted automatic minimization in terms of general binary operators.</p>
]]></description><pubDate>Sun, 15 Mar 2026 20:47:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=47391710</link><dc:creator>LegionMammal978</dc:creator><comments>https://news.ycombinator.com/item?id=47391710</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47391710</guid></item></channel></rss>