ANDRO Range Stats
How many levels does your decode actually have? This node counts them
- image
- image
- report
- histogram
- banding_mask
The question this node answers is the one every number in the comfyui-vae-float32 README was measured with: how much of a frame actually lives outside [0,1], and how finely is it quantised? Everything the pack claims about bf16 being coarser than you think comes from running this on real generations - a stock bf16 decode reading ~77 distinct values in the [0.2, 0.3] window against ~3.3 million for a float32 decode of the same latent.
It's a measuring node, and its one superpower is that it passes the image straight through untouched. The image output is byte-for-byte what went in, so you drop it in a chain, not beside it - decode → Range Stats → whatever's next - and read the numbers without adding a branch or disturbing the wiring.
What comes out
report- a string with min/max/mean, percentiles, the share of samples outside [0,1] that the stock clamp would delete, and the quantisation step reported as effective bits (a bf16 decode reads as ~10.0, real 8-bit material as 8.0). When the distinct-value count nears the sample count in the window it saysSATURATED, because past that point you're measuring the picture's sample count, not the format's precision.histogram- a log-scaled image with the [0,1] clamp limits marked in red. Log scale matters: the out-of-range tails are a fraction of a percent, so on a linear axis they're invisible - which is exactly why people believe nothing is lost.banding_mask- a MASK showing where banding would show up first. The reasoning is worth understanding: a band is one quantisation level held across several pixels, so you need a real gradient and local noise below the step. Noisy material dithers itself and never bands; clean sky and haze do. Wire this to a preview and you'll see precisely which parts of your shot need the precision.
Inputs are just image and a free-text label (so two of these in one graph can be told apart in the log). That's the whole node - two widgets.
The part that feels like a bug but isn't
Here's a ComfyUI trap that makes measuring nodes look broken: the strip that appears when you select nodes on the canvas has a ▶ button, and it does not mean Run. It runs Queue Selected Output Nodes, which tells the executor to keep only the selected output nodes and drop every other node - including Range Stats sitting mid-chain. The run still reports success, with no message about what got skipped. A plain Run (the big button) queues every output node and everything executes. If your stats node "never runs," check that you didn't hit the selection-play button.
Install
This is one of ten nodes in the comfyui-vae-float32 pack - install via ComfyUI-Manager by searching comfyui-vae-float32, or:
cd ComfyUI/custom_nodes
git clone https://github.com/AndreiOrehov/comfyui-vae-float32
Restart, find it under the ANDRO category. The starter workflow the pack ships, 01_measure_your_vae.json, is the fastest way to see the point: it round-trips one image through any VAE you own, decodes it twice (stock and float32), and runs two Range Stats nodes side by side. Same latent, same VAE, one readout with a few hundred thousand more levels than the other. No LTX, no video model, nothing to download - just point VAELoader at a VAE you already have and hit Run. It's by Andrei Orehov / Andromediastudio, Apache-2.0, and it costs nothing to try; whether float32 matters for your shots is exactly the question this node answers before you spend the VRAM.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The batch to measure. It comes back out unchanged, so this node can sit anywhere in a chain. | |
| label | STRING | stats | Free text, printed at the head of the report - so two of these in one graph can be told apart. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | The image, passed through untouched - wire it onward to measure mid-chain. |
| report | STRING | Min/max/mean, percentiles, the share outside [0,1] the stock clamp would delete, the measured quantisation step as EFFECTIVE BITS, and how much of the frame is at risk of banding. |
| histogram | IMAGE | Log-scaled histogram with the [0,1] clamp limits marked in red. Log because the out-of-range tails are a fraction of a percent - on a linear axis they are invisible, which is why people believe nothing is lost. |
| banding_mask | MASK | Where banding will appear first: real gradient, too little noise to dither it. Wire it to a preview to see which parts of the shot need the precision. |