# from #60234 OP

ser1 = pd.Series([False, False])
ser2 = pd.Series([0.0, 0.1])

ser1 | ser2  # <- works by casting floats to bool
ser2 | ser1  # <- raises TypeError

# We also have special-casing for NaNs among floats

ser3 = pd.Series([np.nan, 1.0])

ser3 & ser3            # <- raises bc you can't do float & float
ser3[:-1] & ser3[:-1]  # has no non-NaN floats so we special-case

logical ops (&, |, ^) have inconsistent behavior. I think we should simplify this significantly and more closely resemble the numpy behavior.