Nodes/comfyui-vae-float32/ANDRO Range Stats
ComfyUI Node

ANDRO Range Stats

How many levels does your decode actually have? This node counts them

By AndreiOrehov·Created 28 days ago·Updated about 18 hours ago· 4
ANDRO Range Stats
  • image
  • image
  • report
  • histogram
  • banding_mask
labelstats

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 says SATURATED, 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.

CategoryANDRO

Inputs (2)

NameTypeDefaultDescription
imageIMAGEThe batch to measure. It comes back out unchanged, so this node can sit anywhere in a chain.
labelSTRINGstatsFree text, printed at the head of the report - so two of these in one graph can be told apart.

Outputs (4)

NameTypeDescription
imageIMAGEThe image, passed through untouched - wire it onward to measure mid-chain.
reportSTRINGMin/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.
histogramIMAGELog-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_maskMASKWhere 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.